一方面,一元绑定算子>>=是左结合的。另一方面,一元律要求结合性,即评价顺序不重要(就像单子)。此外,monads通过使下一个效果依赖于上一个结果来编码一个值依赖项,即monad有效地确定了一个评估顺序。这在我看来是自相矛盾的,这显然意味着我对所涉及的概念的心理表征是错误的。这一切是如何结合在一起的?
发布于 2020-09-07 12:25:15
一方面,一元绑定算子
>>=是左关联的。
是。
Prelude> :i >>=
class Applicative m => Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
...
-- Defined in ‘GHC.Base’
infixl 1 >>=这就是它的定义。+也是左结合的,尽管(加法-)群定律要求结合性.
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通过使下一个效果依赖于上一个结果来编码一个值依赖项。
是的,但这与>=>的结合性并不矛盾。示例:
teeAndInc :: String -> Int -> IO Int
teeAndInc name val = do
putStrLn $ name ++ "=" ++ show val
return $ val + 1Prelude 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周围翻转并不会改变操作之间的顺序/依赖(这将是一个交换性定律,而不是一个结合律),它只是改变了动作的分组。
https://stackoverflow.com/questions/63777163
复制相似问题