::
的优先级是多少?有没有哪个运营商的优先级比它低?
::
的优先级似乎低于$
,因为下面的两个表达式都返回"ab"
map head $ ["alice", "bob"] :: String
map head ["alice", "bob"] :: String
答案 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