OCaml 缺点 (::)算子



在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 xsx :: xs相同。

也可以只定义自己的 cons 函数:

let cons = fun a list -> a :: list

相关内容

  • 没有找到相关文章

最新更新