Haskell 理解单子定律

Haskell 理解单子定律,haskell,Haskell,发件人: 何谓 特别是,什么是(m>=f)?这里,m是一个类型函数,f是一个值函数。那么,这种表示法不是没有意义吗?如注释中所述,法律中的m只是一个值变量,与类定义中使用的类型变量m不同 如果您将法律改写为: liftIO (act >>= f) = liftIO act >>= (liftIO . f) 相当于: liftIO $ do x <- act === do x <- liftIO act f x

发件人:

何谓


特别是,什么是
(m>=f)
?这里,
m
是一个类型函数,
f
是一个值函数。那么,这种表示法不是没有意义吗?

如注释中所述,法律中的
m
只是一个值变量,与
类定义中使用的类型变量
m
不同

如果您将法律改写为:

liftIO (act >>= f) = liftIO act >>= (liftIO . f)
相当于:

liftIO $ do x <- act     ===      do x <- liftIO act
            f x                      liftIO (f x)
要获得这样做的动作,或者您可以单独提起IO动作部件:

do x <- liftIO getLine
   liftIO (print x)

dox
m
不是类型签名中的
m
,而是
ma
类型的一元行为。这些实际上只是
MonadTrans
规则,适用于
liftIO
而不是
lift
=
是一个函数,变量
m
也不是签名中的变量。这种阿尔法等价的重新表述是否有帮助:
liftIO(x>>=f)=liftIO x>=(liftIO.f)
?或者,用另一种方式来表达其他人所说的话:在法律的开头有一个隐含的量化;严格地说,它应该是所有m的
。福尔f。liftIO(m>>=f)=liftIO m>>=liftIO。f
。typeclass法则通常是这样的:任何不是类(或其超类)方法的标识符都被隐式地普遍量化。
liftIO $ do x <- act     ===      do x <- liftIO act
            f x                      liftIO (f x)
liftIO $ do x <- getLine
            print x
do x <- liftIO getLine
   liftIO (print x)