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)。
答案 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<_>.Cons
和List<_>.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 = []