0

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

这是我的 fsi 在 vs 代码中的一个例子。

> 27 % 3
-
- ;;
val it : int = 0

> (%) 3 27
- ;;
val it : int = 3

我真的没想到会从中缀和部分中得到不同的结果。

这是上下文管道中的操作:

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

2 回答 2

6

因为你翻转了操作数。(%) 3 27其实意思是3 % 27,不是27 % 3,即你想要(%) 27 3的。

于 2019-06-02T14:29:17.250 回答
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
于 2019-06-02T14:40:55.193 回答