2014-10-29 87 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