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
。
请给我一个理解此代码的好策略。
答案 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