OCaml:为什么 `let f : int -> int list -> int list = (::);;` 失败了?
OCaml: Why does `let f : int -> int list -> int list = (::);;` fail?
我认为 OCaml 会读取
let f : int -> int list -> int list = (::);;
作为部分应用的实例,将函数存储为f
。但是,编译器抱怨该函数应用于太少的参数。任何对此的见解将不胜感激,谢谢。
OCaml中的值::
是构造函数而不是一般函数。因此,它需要以下参数(在括号中)。可以以(::)
的形式使用,但后面必须在括号中跟两个值:
# ( :: ) (3, []);;
- : int list = [3]
其他构造函数也是如此,比如Some
:
# let f : 'a -> 'a option = Some
Error: The constructor Some expects 1 argument(s),
but is applied here to 0 argument(s)
你当然可以这样定义你的函数:
let f : int -> int list -> int list = fun a b -> (::) (a, b)
或者这样:
let f : int -> int list -> int list = fun a b -> a :: b
甚至像这样:
let f : int -> int list -> int list = List.cons
(其他语言,特别是 Haskell,将构造函数视为函数。因此您可以部分应用构造函数等。在我看来,这在美学上更优越,即,它看起来更优雅。)
我认为 OCaml 会读取
let f : int -> int list -> int list = (::);;
作为部分应用的实例,将函数存储为f
。但是,编译器抱怨该函数应用于太少的参数。任何对此的见解将不胜感激,谢谢。
OCaml中的值::
是构造函数而不是一般函数。因此,它需要以下参数(在括号中)。可以以(::)
的形式使用,但后面必须在括号中跟两个值:
# ( :: ) (3, []);;
- : int list = [3]
其他构造函数也是如此,比如Some
:
# let f : 'a -> 'a option = Some
Error: The constructor Some expects 1 argument(s),
but is applied here to 0 argument(s)
你当然可以这样定义你的函数:
let f : int -> int list -> int list = fun a b -> (::) (a, b)
或者这样:
let f : int -> int list -> int list = fun a b -> a :: b
甚至像这样:
let f : int -> int list -> int list = List.cons
(其他语言,特别是 Haskell,将构造函数视为函数。因此您可以部分应用构造函数等。在我看来,这在美学上更优越,即,它看起来更优雅。)