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

Tim*_*son 17 f# function operator-keyword

F#允许您通过以下方式将运算符转换为函数( ):例如,(+)类型int -> int -> int.

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

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

FSI> (::);;

  (::);;
  -^^

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

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

(能够做到这一点很有用.例如,你可以用它来实现折叠方面的地图).

Bri*_*ian 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
Run Code Online (Sandbox Code Playgroud)

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


kvb*_*kvb 6

不幸的是,不,你不能. ::不是运算符,而是根据语言语法的"符号关键字"(参见规范的3.6节),:?>以及其他一些.但是,这里的语言似乎并不完全一致,因为有一些符号关键字可以被视为运算符(至少(*)(<@ @>)).


Yot*_*aXP 5

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

> 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 = []
Run Code Online (Sandbox Code Playgroud)