f#之在此上下文中调用的运算符 "(>=)"是什么
现在我明白第一行代码可以缩短到第二行。这是我第一次遇到它,我找不到任何关于运算符(operator)叫什么的文档。它是一个可以用于其他事物的抽象概念吗?
let contains optValue value =
Option.exists (fun v -> v >= value) optValue
let contains optValue value =
Option.exists ((>=) value) optValue
请您参考如下方法:
您已经被告知,第二个示例应该是 (=)
才能让您的两个函数等效,所以我不再赘述。但我想提醒您,以这种方式使用 >=
运算符可能与您预期的不同。根本原因与 F# 如何进行部分应用有关,并且 https://fsharpforfunandprofit.com/series/thinking-functionally.html是最好的引用。 (相关部分是关于柯里化(Currying)和部分应用的文章,但您需要按顺序阅读整篇文章,因为后面的文章建立在前面文章中解释的概念之上)。
现在,如果您读过这些文章,就会知道 F# 允许函数的部分应用:如果您有一个双参数函数 f a b
,但您只用一个参数调用它 f a
,结果是一个需要参数 b
的函数,当它接收到参数时,它会执行 f a b
。当您将运算符括在括号中时,F# 将其视为函数,因此当您执行 (>=) value
时,您会得到一个正在等待第二个参数 x
的函数,然后将评估 (>=) value x
。当 F# 计算 (op) a b
时,无论运算符是什么,它都与 a op b
相同,所以 (>=) value x
与 value >= x
相同。
这是让大多数人一开始感到困惑的一点。因为当您阅读 Option.exists ((>=) value) optValue
时,您自然希望将其解读为“Does the option contain something greater than or equal to value
” ?但实际上,它实际上是在说“该选项是否包含一个值 x
使得 value >= x
为真?”,即 小于或等于的值值
。
因此,始终如一地应用部分应用的简单规则可能会导致使用大于或小于运算符或实际上任何不可交换运算符的意外结果。请注意这一点,如果您想对非交换运算符使用偏应用,请仔细检查您的逻辑。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。