在OCaml中,有没有办法单独引用缺点运算符?
例如,我可以将 (+)
和 ( * )
用作int -> int -> int
函数,但不能将(::)
用作'a -> 'a list -> 'a list
函数,如以下示例所示:
# (+) 3 5;;
- : int = 8
# ( * ) 4 6;;
- : int = 24
# (::) 1 [2;3;4];;
Error: Syntax error: operator expected.
除了fun x y -> x::y
之外,有没有办法产生像(::)
这样的结果?有谁知道为什么(::)
没有在OCaml中实现?
添加到@seanmcl的答案中,
实际上 OCaml 支持前缀形式 (::):
# (::)(1, []);;
- : int list = [1]
这是非柯里形式,对应于所有 OCaml 变体构造函数都不是柯里化且无法部分应用的事实。这是由一个特殊的解析规则处理的,仅用于 (::),这就是为什么你收到一个相当奇怪的错误消息Error: Syntax error: operator expected.
。
更新:
即将推出的 OCaml 4.02 删除了此解析规则,因此该规则不再可用。
No. 缺点 (::)是构造函数,构造函数不能是中缀运算符。 允许的中缀符号如下所示:
http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html
一些解决方法(如您所提到的)非常详细
(fun x l -> x :: l)
并定义您自己的非传统中缀缺点
let (+:) x l = x :: l
从 Ocaml 4.03 开始,您现在可以使用 cons
(在列表模块中)。也就是说,cons x xs
与x :: xs
相同。
也可以只定义自己的 cons 函数:
let cons = fun a list -> a :: list