从部分应用程序获得的结果与中缀操作符"(%) x y <> x % y -> wtf"不同



我刚刚对值进行了一些验证,以查看它是三个的乘积。 很好地使用模函数。 我想管道到它。 很好地使用部分应用程序。 但显然不是。

这是我的 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

部分应用中缀无法按预期工作。 我的 qustion 中的语句不正确,这不是错误。 对于初学者来说,这可能是一个相当普遍的误解,所以值得好好解释一下。

(%) x y = x % y

因此

(%) 27 3
= 27 % 3
= 0

当管道进入最终值 y 时,就会出现混淆。 你不应该期望

y
|> (%) x

以产生

y % x

而是

x % y

这有点令人困惑,特别是如果您使用了中缀运算符,它确实对称地处理输入(例如 +,=,<>,*),而不会太深入地质疑。 您必须注意提供给中缀操作器的值顺序是否正确,即使它在第一次检查时看起来是正确的。

处理中缀操作符(以您希望提供的相反顺序接受值)的最清晰、最详细的方法是写出一个 lambda。 但是,也可以选择回管"<|"。

这是一段代码,由于我误用了部分应用的中缀,它导致了我的错误。

...
|> Seq.length // 27
|> (%) 3 // 3 % 27 = 3

它可以用回管编写以按预期执行

...
|> Seq.length // 27
|> (%) <|3 // 27 % 3 = 0

或者更清楚地使用λ

...
|> Seq.length // 27
|> (fun x -> x % 3 // 27 % 3 = 0

相关内容

  • 没有找到相关文章

最新更新