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)
doxm
不是类型签名中的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)