首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Control.Applicative优先

Control.Applicative优先
EN

Stack Overflow用户
提问于 2014-03-04 02:37:02
回答 2查看 130关注 0票数 1

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

代码语言:javascript
复制
f = (expr1 <|> expr2) <* expr3

是否有必要加上括号?也就是说,无论哪个分支被拿走,expr3都会被评估(并被丢弃)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-04 02:49:02

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

代码语言:javascript
复制
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 <*

相关的位元有以下两行:

代码语言:javascript
复制
infixl 3 <|>
infixl 4 <*

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

票数 10
EN

Stack Overflow用户

发布于 2014-03-04 02:49:21

<|>的优先级为3,<*为4,因此需要括号。

代码语言:javascript
复制
$ 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 <*
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22161760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档