类型注释(::)的中缀优先级是多少

时间:2018-06-21 05:48:26

标签: haskell

::的优先级是多少?有没有哪个运营商的优先级比它低?

::的优先级似乎低于$,因为下面的两个表达式都返回"ab"

map head $ ["alice", "bob"] :: String
map head ["alice", "bob"] :: String

1 个答案:

答案 0 :(得分:18)

::部分称为类型注释。

邮件列表上的消息指向完全相同的结论,并得到语法的支持:

https://mail.haskell.org/pipermail/beginners/2012-December/011017.html

  

它实际上不是二进制运算符。

     

这是语法的一部分,因此没有确切的优先级,但是由于您   问一下,我想您对类型声明不感兴趣

foo :: Int -> Double  
foo = sin . fromIntegral
     

而是表达式类型签名。不受上下文限制的生产   语法是

exp → infixexp :: [context =>] type
     

因此签名适用于整个中缀表达式:

Prelude> toEnum . floor $ 12.7 + toEnum 73 :: Char
'U'
     

因此,如果有优先级,它将低于0(($)的优先级)。

     

但请注意

     

“关于lambda抽象程度的语法不明确,   让表达式和条件句。歧义由   这些规则中的每一个都向右延伸的元规则   尽可能的。”

     

因此

Prelude> (\x -> x + x :: Int -> Int) 2

<interactive>:16:10:
    No instance for (Num (Int -> Int)) arising from a use of `+'
    Possible fix: add an instance declaration for (Num (Int -> Int))
    In the expression: x + x :: Int -> Int
    In the expression: \ x -> x + x :: Int -> Int
    In the expression: (\ x -> x + x :: Int -> Int) 2
     

此处的类型签名仅扩展到x + x,因为它是   解析为lambda抽象的一部分

     

[\x -> (x + x :: Int -> Int)向右延伸的距离不只是   \x -> x + x]

     

因此,如果要为lambda抽象赋予类型签名,则可以   需要明确的括号:

Prelude> ((\x -> x + x) :: Int -> Int) 2 4