【发布时间】:2020-11-12 12:32:10
【问题描述】:
来自LYAH 我了解到do 符号只是单子风格的语法糖;从wikibook 我读到的或多或少是一样的;所以我的理解是,如果没有 Monad 实例,就不可能有任何 do 符号。
然而,我阅读了Functor 类型 ctor 的 Functor 实例的定义。
instance Functor IO where
fmap f action = do
result <- action
return (f result)
这只是下面的语法糖,不是吗?
instance Functor IO where
fmap f action = action >>= return . f
这意味着IO首先是Monad的实例;这与每个Monad 都是Functor 而不是相反的事实相矛盾。
事实上,我已经意识到Monad 是“比”Applicative,而Functor 又是“比”Functor,它与 Applicative 的定义执行一起使用对其实例的Functor 约束(以及Monad 的定义理想情况下要求其实例为Applicatives,如如果不是Applicative,则不要将其设为Monad em>)。
换句话说,如果IO 不是Monad,那么上面的代码让我认为没有办法为IO 编写Functor 实例。
现在我想起来,也许这就像说IO 是作为一个成熟的Monad 创建的,而上面的实例后来只是为了完整性和数学一致性。
但是我很困惑,所以我在这里寻求帮助。
【问题讨论】:
标签: haskell monads functor io-monad do-notation