关于Control.Applicative,如果我有以下表达式:
f = (expr1 <|> expr2) <* expr3是否有必要加上括号?也就是说,无论哪个分支被拿走,expr3都会被评估(并被丢弃)吗?
发布于 2014-03-04 02:49:02
您可以向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)。
发布于 2014-03-04 02:49:21
<|>的优先级为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 <*https://stackoverflow.com/questions/22161760
复制相似问题