2014-10-29 113 views
0

此代码不编译:F#:算符优先

let f (x:byte) = printfn "%d" x 

let b = int 'a' 
f(byte <| b ||| 0x1) 
(4,17): error FS0001: This expression was expected to have type 
    byte 
but here has type 
    int 

的F#操作者表状态的向后管 operaotor (<|)其具有的一种形式(< op)的优先级低于按位或运营商(|||)

所以我想应该(byte <| b ||| 0x1)被解析为(byte <| (b ||| 0x1))。但编译器错误消息表明它被解析为((byte <| b) ||| 0x1)。这里发生了什么事?

+0

是的,我认为你是正确的,该优先顺序表是错误的/在这种情况下,误导性 - 我建议只需切换到'|>'在'b ||| 0x1 |>字节' – Carsten 2014-10-29 12:59:35

+1

我只看了一下FSharp规范(http://fsharp.org/specs/language-spec/3.1/FSharpSpec-3.1-working.docx),并且'<|'确实具有更高的优先级比'|||'(如果我读了右表) - 这很可能是MSDN文档中的错误,或者它已被更改并且未更新 – Carsten 2014-10-29 13:28:38

+0

@CarstenKönig有趣......如果您将其作为“答案”发布,我会接受它 – nodakai 2014-10-29 13:36:36

回答

3

我只是看看FSharp规格有<|确实比|||更高的优先级(如果我读的右表)

所以最有可能的是提供一个错误在MSDN文档或进行了修改和未更新。

这是第35页:

enter image description here

+0

我认为“'| OP'”涵盖*按位或*运算符'(|||)' – nodakai 2014-10-29 13:47:47

+0

上面有一段文字表示“OP”只有在其他地方没有定义的情况下才匹配,我认为它可能与(或可能是错误的)相匹配 - 只要看看自己 – Carsten 2014-10-29 13:49:47

+0

无论如何,它可能是自上而下,左右的,即使它匹配相同的行<|仍然会在|||之前出现 - 所以我认为它不是一个真正的bug(但是我发现优先规则很奇怪 - 希望你可以像Haskell一样自己定义它,而不是使用一些奇怪的前缀符号规则) – Carsten 2014-10-29 13:51:48