无法从部分应用程序中获得与中缀运算符“(%) x y <> x % y -> wtf”相同的结果
Not getting the same result from a partial application as with an infix opperatior "(%) x y <> x % y -> wtf"
我刚刚对价值进行了一些验证,发现它是三的乘积。很好地使用模函数。我想管它。很好地使用部分应用程序。但显然不是。
这是我在 vs 代码中的 fsi 的示例。
> 27 % 3
-
- ;;
val it : int = 0
> (%) 3 27
- ;;
val it : int = 3
我真的没想到中缀和部分会得到不同的结果。
这是上下文管道中的操作:
...
|> Seq.length // 27
|> (%) 3 // 3
因为你翻转了操作数。 (%) 3 27
实际上意味着 3 % 27
,而不是 27 % 3
,即你想要 (%) 27 3
.
中缀的部分应用没有像我预期的那样工作。我的问题中的陈述不正确,这不是错误。对于初学者来说,这可能是一个相当普遍的误解,因此值得好好解释一下。
(%) x y = x % y
因此
(%) 27 3
= 27 % 3
= 0
输入最终值 y 时会出现混淆。
你不应该期待
y
|> (%) x
导致
y % x
而是
x % y
这有点令人困惑,特别是如果您使用了中缀运算符,它会对称地处理输入(例如 +、=、<>、*),而不会问得太深。您必须注意提供给中缀运算符的值的顺序是正确的,即使它在第一次检查时看起来是正确的。
处理中缀运算符的最清晰和最冗长的方法是只写一个 lambda,它接受与您希望提供的顺序相反的值。但是,也可以选择支持管道 '<|'。
这是一段代码,由于我误用了部分应用的中缀,导致我出现错误。
...
|> Seq.length // 27
|> (%) 3 // 3 % 27 = 3
它可以用一个 backpipe 来编写,以达到预期的效果
...
|> Seq.length // 27
|> (%) <|3 // 27 % 3 = 0
或者用 lambda 更清楚
...
|> Seq.length // 27
|> (fun x -> x % 3 // 27 % 3 = 0
我刚刚对价值进行了一些验证,发现它是三的乘积。很好地使用模函数。我想管它。很好地使用部分应用程序。但显然不是。
这是我在 vs 代码中的 fsi 的示例。
> 27 % 3
-
- ;;
val it : int = 0
> (%) 3 27
- ;;
val it : int = 3
我真的没想到中缀和部分会得到不同的结果。
这是上下文管道中的操作:
...
|> Seq.length // 27
|> (%) 3 // 3
因为你翻转了操作数。 (%) 3 27
实际上意味着 3 % 27
,而不是 27 % 3
,即你想要 (%) 27 3
.
中缀的部分应用没有像我预期的那样工作。我的问题中的陈述不正确,这不是错误。对于初学者来说,这可能是一个相当普遍的误解,因此值得好好解释一下。
(%) x y = x % y
因此
(%) 27 3
= 27 % 3
= 0
输入最终值 y 时会出现混淆。 你不应该期待
y
|> (%) x
导致
y % x
而是
x % y
这有点令人困惑,特别是如果您使用了中缀运算符,它会对称地处理输入(例如 +、=、<>、*),而不会问得太深。您必须注意提供给中缀运算符的值的顺序是正确的,即使它在第一次检查时看起来是正确的。
处理中缀运算符的最清晰和最冗长的方法是只写一个 lambda,它接受与您希望提供的顺序相反的值。但是,也可以选择支持管道 '<|'。
这是一段代码,由于我误用了部分应用的中缀,导致我出现错误。
...
|> Seq.length // 27
|> (%) 3 // 3 % 27 = 3
它可以用一个 backpipe 来编写,以达到预期的效果
...
|> Seq.length // 27
|> (%) <|3 // 27 % 3 = 0
或者用 lambda 更清楚
...
|> Seq.length // 27
|> (fun x -> x % 3 // 27 % 3 = 0