首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算子结合性、结合律和单值依赖关系是如何结合在一起的?

算子结合性、结合律和单值依赖关系是如何结合在一起的?
EN

Stack Overflow用户
提问于 2020-09-07 11:56:20
回答 1查看 234关注 0票数 5

一方面,一元绑定算子>>=是左结合的。另一方面,一元律要求结合性,即评价顺序不重要(就像单子)。此外,monads通过使下一个效果依赖于上一个结果来编码一个值依赖项,即monad有效地确定了一个评估顺序。这在我看来是自相矛盾的,这显然意味着我对所涉及的概念的心理表征是错误的。这一切是如何结合在一起的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-07 12:25:15

一方面,一元绑定算子>>=是左关联的。

是。

代码语言:javascript
复制
Prelude> :i >>=
class Applicative m => Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  ...
    -- Defined in ‘GHC.Base’
infixl 1 >>=

这就是它的定义。+也是左结合的,尽管(加法-)群定律要求结合性.

代码语言:javascript
复制
Prelude> :i +
class Num a where
  (+) :: a -> a -> a
  ...
    -- Defined in ‘GHC.Num’
infixl 6 +

infixl声明意味着编译器将把a+b+c解析为(a+b)+c;这是否恰好等于a+(b+c)是另一回事。

单模定律要求结合性

嗯,>>=实际上是而不是结合。结合算子是>=>。对于>>=,类型已经显示它不能是关联的,因为第二个参数应该是一个函数,而第一个不是。

此外,monad通过使下一个效果依赖于上一个结果来编码一个值依赖项。

是的,但这与>=>的结合性并不矛盾。示例:

代码语言:javascript
复制
teeAndInc :: String -> Int -> IO Int
teeAndInc name val = do
   putStrLn $ name ++ "=" ++ show val
   return $ val + 1
代码语言:javascript
复制
Prelude Control.Monad> ((teeAndInc "a" >=> teeAndInc "b") >=> teeAndInc "c") 37
a=37
b=38
c=39
40
Prelude Control.Monad> (teeAndInc "a" >=> (teeAndInc "b" >=> teeAndInc "c")) 37
a=37
b=38
c=39
40

在parens周围翻转并不会改变操作之间的顺序/依赖(这将是一个交换性定律,而不是一个结合律),它只是改变了动作的分组。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63777163

复制
相关文章

相似问题

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