在这种情况下,运算符“(> =)”是什么?

use*_*180 3 f#

现在,我知道可以将第一行代码缩短为第二行。这是我第一次遇到它,找不到关于该运算符的任何文档。它是否也可以用于其他事物的抽象概念?

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

let contains optValue value =
    Option.exists ((>=) value) optValue
Run Code Online (Sandbox Code Playgroud)

rmu*_*unn 5

您已经被告知,第二个示例应该(=)使您的两个函数等效,因此我不会赘述。但我想警告您,>=以这种方式使用运算符的工作方式可能与您期望的有所不同。根本原因与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,您自然希望将其阅读为“该选项是否包含大于或等于value”的内容?但事实上,它实际上是说:“是否选择包含一个值x,从而value >= x是真的吗?”,即一些小于或等于 value

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