问题描述
F#可以让你用( )来把操作符变成函数:例如(+)类型为 int - > int - > int 。
F# lets you turn operators into functions by surrounding them with ( ): for instance, (+) is of type int -> int -> int.
是否可以使用list cons操作符 :: ?
Is it possible to do this with the list cons operator, ::?
它不像普通的二元运算符:
It doesn't behave like a normal binary operator:
FSI> (::);; (::);; -^^ c:\temp\stdin(3,2): error FS0010: Unexpected symbol '::' in expression. Expected ')' or other token.
List.Cons 方法需要一个元组;它不会受到干扰。
And the List.Cons method takes a tuple; it's not curried.
(能够做到这一点很有用,例如,您可以使用它来实现)。
(It's useful to be able to do this. For instance, you can use it to implement map in terms of fold).
推荐答案
来自
(::)是一个区别联合列表的'构造函数'<'>键入,因此引发了一个问题:是否应将其参数作为函数值进行curried(如 + )或元组化(与所有DU构造函数一样) 。无论哪种方式,对某些人来说似乎都是鱼腥味/令人意想不到的,所以F#只是不允许构造。
(::) is a discriminated union 'constructor' for the list<'a> type, and so raised the question of whether as a function value its arguments should be curried (like +) or tupled (like all DU constructors). Either way seems fishy/unexpected to some people, so F# simply disallows the construct.
当然,你总是可以编写例如
Of course you can always write e.g.
let cons x y = x :: y
并使用 cons ,或者使用lambda fun xy - > x :: y ,如果你想要一个两个参数的curried前缀函数。
and use cons, or just use a lambda fun x y -> x::y, if you want a "curried prefix function of two args" for this.
这篇关于作为函数使用列表cons操作符(a :: b)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!