=)"是什么?-6ren"> =)"是什么?-现在我明白第一行代码可以缩短到第二行。这是我第一次遇到它,我找不到任何关于运算符(operator)叫什么的文档。它是一个可以用于其他事物的抽象概念吗? let contains optValue v-6ren">
gpt4 book ai didi

f# - 在此上下文中调用的运算符 "(>=)"是什么?

转载 作者:行者123 更新时间:2023-12-01 08:07:12 25 4
gpt4 key购买 nike

现在我明白第一行代码可以缩短到第二行。这是我第一次遇到它,我找不到任何关于运算符(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 xvalue >= x 相同。

这是让大多数人一开始感到困惑的一点。因为当您阅读 Option.exists ((>=) value) optValue 时,您自然希望将其解读为“Does the option contain something greater than or equal to value” ?但实际上,它实际上是在说“该选项是否包含一个值 x 使得 value >= x 为真?”,即 小于或等于的值

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

关于f# - 在此上下文中调用的运算符 "(>=)"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56709116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com