Control.Applicative precedence

时间:2014-03-04 02:37:02

标签: haskell operator-precedence applicative

关于Control.Applicative,如果我有以下表达式:

f = (expr1 <|> expr2) <* expr3

支架是否必要?也就是说,无论采用哪个分支,expr3都会被评估(并抛弃)吗?

2 个答案:

答案 0 :(得分:10)

您可以向ghci询问优先信息:

Prelude Control.Applicative> :i <|>
class Applicative f => Alternative f where
  ...
  (<|>) :: f a -> f a -> f a
  ...
    -- Defined in `Control.Applicative'
infixl 3 <|>
Prelude Control.Applicative> :i <*
class Functor f => Applicative f where
  ...
  (<*) :: f a -> f b -> f a
    -- Defined in `Control.Applicative'
infixl 4 <*

相关位有以下两行:

infixl 3 <|>
infixl 4 <*

由于<*具有更高的优先级(4),因此它更紧密;是的,需要括号来防止将其解析为expr1 <|> (expr2 <* expr3)

答案 1 :(得分:3)

<|>的优先级为3; <*为4.所以括号是必需的。

$ ghci
λ import Control.Applicative
λ :info <|>
class Applicative f => Alternative f where
  ...
  (<|>) :: f a -> f a -> f a
  ...
    -- Defined in `Control.Applicative'
infixl 3 <|>
λ :info <*
class Functor f => Applicative f where
  ...
  (<*) :: f a -> f b -> f a
    -- Defined in `Control.Applicative'
infixl 4 <*