Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么F#中的换行符对某些表达式的效果不同,并且(可以说)在某些表达式中违反直觉?_F#_Boolean_Operator Precedence - Fatal编程技术网

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

为什么F#中的换行符对某些表达式的效果不同,并且(可以说)在某些表达式中违反直觉?,f#,boolean,operator-precedence,F#,Boolean,Operator Precedence,免责声明/编辑:这是一个相当简单的问题,但我之所以问这个问题,是因为我(仍然)经常被F#中的求值顺序搞糊涂,特别是关于换行符和空格。尝试和错误总是能让我达到我想要的目的,但我认为如果你不得不尝试和错误,你不可能真正理解一门语言 如果我写: let res x = x * 1 = x |> ignore let res x = x * 1 = x && x * -1 = -x |> ignore 没关系,但如果我写: let res

免责声明/编辑:这是一个相当简单的问题,但我之所以问这个问题,是因为我(仍然)经常被F#中的求值顺序搞糊涂,特别是关于换行符和空格。尝试和错误总是能让我达到我想要的目的,但我认为如果你不得不尝试和错误,你不可能真正理解一门语言

如果我写:

let res x =
    x * 1 = x
    |> ignore
let res x =
    x * 1 = x && x * -1 = -x
    |> ignore
没关系,但如果我写:

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
是布尔表达式,
Z
是任何函数

这是真的吗?有没有更简单的方法来找出这个问题?或者更好,空白什么时候是一个重要的操作符,什么时候不是


再举一个例子:

let v = x |> fun x -> float x |> fun y -> true
为什么这里的
y
是float类型而不是
int->float类型?这可能是显而易见的,我肯定已经用这种方式编程了数千行,甚至感觉很自然,但为什么呢

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

看,似乎
&&
|>
具有更高的优先级,因此您的猜测是正确的,您需要添加括号:

let res x =
  (x * 1 = x && x * -1 = -x)
  |> ignore
新行似乎不起分隔符的作用,除非它具有let绑定或符合所列规则之一

例如,如果采用以下表达式:

let res = 
  5 + 1
    .GetType()

您还将得到一个错误,因为它将
运算符应用于
1
而不是整个表达式,所以不管换行符是什么,优先规则仍然保持不变。

看起来您需要在这个表达式中添加括号:
(x*1=x&&x*-1=-x)
@gustavo,我知道,这就是我写的。但这不是这里的问题……:)那你的问题是什么?据我所知,你的猜测是正确的。@gustavo我一直认为换行符只是另一个操作符,类似于
。它通常不会像空白一样被忽略。那么这里的规则是什么呢?FWIW,我仍然经常采用反复试验的方法,而且我已经写了六年F#on/off了……这绝对是这个问题的一个有效答案,谢谢。我编辑了我的问题,希望能更好地理解我的目标。答案很可能是“它是什么,因为它是这样定义的”,而不是它本身。