SML中的通用列表打印功能

时间:2013-11-11 20:10:33

标签: list printing sml

我必须编写一个函数来使用以下类型签名在SML中打印列表:

     val printGenList = fn : ('a -> 'b) -> 'a list -> unit

“printGenList”将采用函数f和列表l两个参数,并将函数f递归地应用于列表l的每个元素。

由于我是ML的新手,我无法实现它,但我尝试了这个代码,它提供了不同类型的签名

     fun printGenList = CONS(fib, fn => printGenList fib fibs);

 where,  fib is
        fun fib a b = CONS(a, fn => fib b (a+b));
 and fibs is
        val fibs = fib 0 1;

1 个答案:

答案 0 :(得分:2)

你要做的事情是不可能的,ML的类型系统不支持这种类型的多态性。如果您使用Google,则会有一些针对SML的printf库向您展示如何处理此问题 - 对于您要打印的每种类型t,您需要定义单独的t -> unit函数并撰写他们在一起。

编辑:哦,我知道,你不是在寻找打印任何类型列表的函数,而是在寻找一个更高阶函数,它将'a->'b函数应用于列表的每个元素。 .. 我的错。这就是你需要的:

val rec printGenList = 
 fn (f : 'a -> 'b) =>
    (fn [] => ()
    | x::xs => (f(x); printGenList f xs))