函数中是否有 (<) 的模等价物?

Is there a modulo equivalent for (<) in functions?

例如;下面一行

    |> Seq.filter(fun i -> i < 123)

相同
    |> Seq.filter((<) 123)

模运算符有这种东西吗?我不确定第二个变体是什么,也无法在文档中找到它的引用,因此搜索起来有些困难。所以为了加分,请告诉我这个接线员叫什么! :)

目前正在使用:

|> Seq.filter (fun i -> i % 2 = 0)

寻找类似的东西:

|> Seq.filter ((%) 2 = 0)

唉,你真倒霉,因为要使部分应用程序适用,你需要交换 mod 运算符的两个参数。考虑到您正在应用两个需要函数组合的运算符,lambda 函数更加简洁。

let flip f a b = f b a
{0..9}
|> Seq.filter ((flip (%) 2) >> ((=) 0))
|> (Seq.map string >> String.concat ", ")
// val it : string = "0, 2, 4, 6, 8"

另一种选择,如果您坚决不写出 lambda,则将其提升到一个函数中:

let inline isEven x = x % 2 = 0

...

|> Seq.filter isEven

你的第一个例子说 fun i -> i < 123 等于 ((<) 123) 是不正确的。这实际上相当于 fun i -> 123 < i。让我解释一下,每个运算符只是一个函数,只是中缀而不是前缀。举个例子

let (+) x y = x + y
let add x y = x + y

let (-) a b = a - b // notice that the first argument (a) is on the left side of the operator
let subs a b = a - b

知道了这一点,我们就可以用同样的方式推理 %<

let (%) x y = x % y
let (<) x y = x < y

// therefore
fun i -> i < 123

// is equivalent to
fun i -> (<) i 123

// and mathematically equiv to 
((>=) 123)

// same with %
fun i -> i % 2

// is equiv to
fun i -> (%) i 2

// thus cant be reduced to eliminate the lambda