使用list cons运算符(a :: b)作为函数

时间:2010-09-29 12:15:53

标签: function f# operator-keyword

F#允许您通过( )包围操作符来将操作符转换为函数:例如,(+)的类型为int -> int -> int

是否可以使用list cons运算符::

执行此操作

它的行为不像普通的二元运算符:

FSI> (::);;

  (::);;
  -^^

c:\temp\stdin(3,2): error FS0010: Unexpected symbol '::' in expression.
Expected ')' or other token.

List.Cons方法需要一个元组;它并非咖喱。

(能够做到这一点很有用。例如,你可以用它来实现map in terms of fold)。

3 个答案:

答案 0 :(得分:16)

http://cs.hubfs.net/forums/permalink/11713/11713/ShowThread.aspx#11713

转述

(::)list<'a> type的一个有区别的联合'构造函数',因此提出了一个问题:作为一个函数值,它的参数是否应该被curry(如+)或tupled(像所有DU构造函数一样)。无论哪种方式对某些人来说都是可疑的/意外的,所以F#根本不允许这种结构。

当然你总是可以写下来。

let cons x y = x :: y

并使用cons,或者只使用lambda fun x y -> x::y,如果你想要一个“两个args的curried前缀函数”。

答案 1 :(得分:6)

不幸的是,不,你不能。 ::不是运算符,而是根据语言语法的“符号关键字”(请参阅​​3.6 of the spec部分),:?>和其他几个。但是,这里的语言似乎并不完全一致,因为有一些符号关键字可以被视为运算符(至少(*)(<@ @>))。

答案 2 :(得分:4)

::[]分别可以由List<_>.ConsList<_>.Empty表示。请记住,前者以元组为参数。这些都在这里,因此列表可以用F#以外的语言创建。

> List.Cons(4, List.Empty);;
val it : int list = [4]

> 4::[];;
val it : int list = [4]

> List<int>.Cons(4, List<int>.Empty);;
val it : int list = [4]

> List.Cons;;
val it : 'a * 'a list -> 'a list = <fun:clo@24-7> //'

> List<int>.Empty;;
val it : int list = []