F# 运营商是什么;(>;=)";在这种情况下调用?

F# 运营商是什么;(>;=)";在这种情况下调用?,f#,F#,现在我明白了,第一行代码可以缩短为第二行。这是我第一次遇到它,我找不到任何关于这个操作符的文档。它是一个抽象的概念,也可以用于其他事情吗 let contains optValue value = Option.exists (fun v -> v >= value) optValue let contains optValue value = Option.exists ((>=) value) optValue 您已经被告知,第二个示例应该是(=),以使

现在我明白了,第一行代码可以缩短为第二行。这是我第一次遇到它,我找不到任何关于这个操作符的文档。它是一个抽象的概念,也可以用于其他事情吗

let contains optValue value =
    Option.exists (fun v -> v >= value) optValue

let contains optValue value =
    Option.exists ((>=) value) optValue

您已经被告知,第二个示例应该是
(=)
,以使您的两个函数等效,因此我不再赘述。但我想警告您,以这种方式使用
=
运算符可能会与您预期的工作方式不同。根本原因与F#如何进行部分应用有关,这是最好的参考。(相关部分是关于咖喱和部分应用程序的文章,但您需要按顺序阅读整个内容,因为后面的文章建立在前面文章中解释的概念之上)

现在,如果你读过这些文章,你就会知道F#允许函数的部分应用:如果你有一个双参数函数
fab
,但你只使用一个参数
fa
,结果是一个函数需要一个参数
b
,当它收到这个参数时,它就会执行
fab
。当你把一个操作符括在括号里时,F#把它当作一个函数,所以当你做
(>=)value
,你会得到一个等待第二个参数
x
,然后计算
(>=)value x
。当F#计算
(op)ab
时,无论运算符是什么,它都与
a op b
相同,因此
(>=)值x
值>=x
相同

而这正是大多数人一开始就感到困惑的地方。因为当您读取
Option.exists((>=)value)optValue
时,您自然希望将其读取为“该选项是否包含大于或等于
value
”的内容?”?但事实上,它实际上是在说“该选项是否包含一个
x
值,使得
value>=x
为真?”,即小于或等于
value
的值


因此,部分应用的简单规则,如果应用一致,可能会导致使用大于或小于运算符,或者实际上任何不可交换的运算符的意外结果。请注意这一点,如果您想将部分应用程序与非交换运算符一起使用,请仔细检查您的逻辑。

这只是作为函数的大于或等于运算符,尽管要与第一个运算符等效,您应该使用
=
,即
选项。存在(=)值)optValue
是的。“=”是中缀运算符。通过在其周围添加括号,可以使其成为前缀运算符。如果你想添加它作为答案,我会接受的。顺便说一句,这两个函数做的事情并不相同。第二个版本中的选择器函数必须是
(=)value
,或者第一个版本中的lambda
fun v->value>=v
,两者才能相同。