F#允许您通过使用(
)
将运算符转换为函数:例如,(+)
的类型为int -> int -> int
。
是否可以使用list cons运算符::
执行此操作
它的行为与普通的二元运算符不同:
FSI> (::);;
(::);;
-^^
c:\temp\stdin(3,2): error FS0010: Unexpected symbol '::' in expression.
Expected ')' or other token.
List.Cons
方法接受一个元组;它不是curried的。
(能够做到这一点很有用。例如,您可以使用它来实现map in terms of fold)。
发布于 2010-09-30 01:08:15
改写自http://cs.hubfs.net/forums/permalink/11713/11713/ShowThread.aspx#11713
(::)
是list<'a> type
的一个有区别的联合“构造函数”,因此提出了一个问题:作为函数值,它的参数应该是curried (像+
一样)还是tupled (像所有DU构造函数一样)。对于某些人来说,这两种方式似乎都很可疑/意想不到,所以F#干脆不允许这种构造。
当然,你也可以这样写。
let cons x y = x :: y
使用cons
,或者只使用一个lambda fun x y -> x::y
,如果你想要一个“两个参数的curried前缀函数”。
发布于 2010-09-29 20:38:05
不幸的是,不,你不能。::
不是一个操作符,而是一个根据语言语法的“符号关键字”(参见3.6 of the spec小节),就像:?>
和其他一些人一样。然而,这种语言在这里似乎并不完全一致,因为有一些符号关键字可以被视为操作符(至少是(*)
和(<@ @>)
)。
发布于 2010-09-30 00:28:22
::
和[]
都可以分别用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 = []
https://stackoverflow.com/questions/3821472
复制相似问题