我在确定OCaml类型时遇到了一些麻烦。为什么以下表达式的类型为:
let f x y z = z (y::x)
'a list->'a->('a list->'b)->'b
z (y::x)
是什么意思?我知道y::x
意味着将y
元素附加到列表x
,但z
会做什么?
谢谢!
答案 0 :(得分:3)
首先,请注意y::x
预先,而非追加,元素y
列出x
。
f
类型的四个部分可以解释如下:
f
的第一个参数是x
,因此f
类型的第一部分是'a list
,这与使用{{1}一致} {作为x
。f
类型的第二部分是f
,与列表'a
中的前置元素y
一致,因为x
是x
'a list
,y
必须是'a
。f
的第三个参数是z
,它必须是一个函数,将'a list
作为其第一个参数,给出它在f
定义中的用法。因此,f
类型的第三部分是('a list -> 'b)
,其中'b
是z
的返回类型。f
的返回类型与z
的返回类型相同,因此f
类型的最后一部分是'b'
。