首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用list cons运算符(a ::b)作为函数

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

Stack Overflow用户
提问于 2010-09-29 20:15:53
回答 3查看 3.1K关注 0票数 19

F#允许您通过使用( )将运算符转换为函数:例如,(+)的类型为int -> int -> int

是否可以使用list cons运算符::执行此操作

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

代码语言:javascript
复制
FSI> (::);;

  (::);;
  -^^

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

List.Cons方法接受一个元组;它不是curried的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-30 01:08:15

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

(::)list<'a> type的一个有区别的联合“构造函数”,因此提出了一个问题:作为函数值,它的参数应该是curried (像+一样)还是tupled (像所有DU构造函数一样)。对于某些人来说,这两种方式似乎都很可疑/意想不到,所以F#干脆不允许这种构造。

当然,你也可以这样写。

代码语言:javascript
复制
let cons x y = x :: y

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

票数 17
EN

Stack Overflow用户

发布于 2010-09-29 20:38:05

不幸的是,不,你不能。::不是一个操作符,而是一个根据语言语法的“符号关键字”(参见3.6 of the spec小节),就像:?>和其他一些人一样。然而,这种语言在这里似乎并不完全一致,因为有一些符号关键字可以被视为操作符(至少是(*)(<@ @>))。

票数 6
EN

Stack Overflow用户

发布于 2010-09-30 00:28:22

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

代码语言:javascript
复制
> 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 = []
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3821472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档