我必须编写一个函数来使用以下类型签名在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;
答案 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))