Mik*_*zel 1 haskell operator-precedence applicative
关于Control.Applicative,如果我有以下表达式:
f = (expr1 <|> expr2) <* expr3
Run Code Online (Sandbox Code Playgroud)
括号是否必要?也就是说,expr3无论采用哪个分支,都会得到评估(并抛弃)?
Dan*_*ner 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 <*
Run Code Online (Sandbox Code Playgroud)
相关位有以下两行:
infixl 3 <|>
infixl 4 <*
Run Code Online (Sandbox Code Playgroud)
由于<*具有更高的优先级(4),它更紧密; 所以是的,需要括号来防止被解析为expr1 <|> (expr2 <* expr3).