函数中是否有 (<) 的模等价物?
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
例如;下面一行
|> 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