0

我必须编写一个函数来打印具有以下类型签名的 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;
4

1 回答 1

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))
于 2013-11-15T17:26:14.487 回答