gpt4 book ai didi

f# - 为什么 F# 中换行符的效果对于某些表达式不同,并且(可以说)在其中一些表达式中违反直觉?

转载 作者:行者123 更新时间:2023-12-01 10:32:37 25 4
gpt4 key购买 nike

免责声明/编辑:这是一个相当简单的问题,但我问这个问题是因为我(仍然)经常对 F# 中的求值顺序感到困惑,尤其是。关于换行符与空格。反复试验总是让我到达我想去的地方,但我认为如果你不得不诉诸反复试验,你就无法真正理解一种语言。

如果我写:

let res x =
x * 1 = x
|> ignore

一切都很好,但是如果我写:

let res x =
x * 1 = x && x * -1 = -x
|> ignore

然后编译器提示(它说它期望 bool -> bool,而不是 bool -> unit)。我本来希望换行符在这里充当分隔符。

添加括号有帮助,将其放在一行表明它被计算为 (X && (Y |> Z)),其中 X Y 是 boolean 表达式,Z 是任意函数。

这是真的吗?有没有更简单的方法来找出这一点?或者更好的是,空格什么时候是重要的运算符,什么时候不是?


再举个例子:

let v = x |> fun x -> float x |> fun y -> true

为什么这里的 y 是 float 类型而不是 int -> float 类型?这可能是显而易见的,而且我确实以这种方式编写了数千行代码,甚至感觉自然,但为什么呢?

如果给出的唯一答案是“运算符优先级和 ->|> 之前”,那就这样吧。但我猜/希望这一切背后有一些更学术或更正式的东西(而且我仍然觉得奇怪的是 && 的优先级低于 |>,再一次,我不不明白为什么,在那种情况下感觉违反直觉)。

最佳答案

查看https://learn.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/symbol-and-operator-reference/#operator-precedence似乎 && 的优先级高于 |> 所以你的猜测是正确的,你需要添加括号:

let res x =
(x * 1 = x && x * -1 = -x)
|> ignore

看起来新行不作为分隔符,除非它具有 let 绑定(bind)或符合列出的规则之一 here

例如,如果你采用这个表达式:

let res = 
5 + 1
.GetType()

您还会得到一个错误,因为它将 . 运算符应用于 1 而不是整个表达式,因此无论换行符如何,优先级规则仍然有效。

关于f# - 为什么 F# 中换行符的效果对于某些表达式不同,并且(可以说)在其中一些表达式中违反直觉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com