了解ML中的函数返回函数有什么好的策略?

时间:2017-03-15 04:16:45

标签: sml ml

val g1 = fn x => fn y => fn z => (x y) :: z;
val g1 = fn : ('a -> 'b) -> 'a -> 'b list -> 'b list

这是代码和输出。我不知道为什么输出是这样的。

我理解'b list -> 'b list,因为z显然是一个列表,所以(x y) :: z也是列表。

但是,我不明白为什么fn x => fn y('a -> 'b) -> 'a

我不知道为什么它是('a -> 'b) -> 'a

请给我一个理解此代码的好策略。

1 个答案:

答案 0 :(得分:3)

那里没有任何类型('a -> 'b) -> 'a

->关联到右边,所以

('a -> 'b) -> 'a -> 'b list -> 'b list

('a -> 'b) -> ('a -> ('b list -> 'b list))

定义也是如此;

fn x => fn y => fn z => (x y) :: z

fn x => (fn y => (fn z => (x y) :: z))

即,

  • x'a -> 'b
  • y'a
  • z'b list
  • 结果为'b list

如果你发现这个功能

,也许会更清楚
fun g2(x, y, z) = (x y) :: z

有类型

(('a -> 'b) * 'a * 'b list) -> 'b list