MaybeT的Monad与Applicative上下文一致性存疑:反例及困惑
关于MaybeT的Monad与Applicative一致性问题
在验证MaybeT的Monad与Applicative是否满足<*> a = do x <- f; y <- a; return (x y)这一一致性条件时,发现二者存在不一致的情况,以下是具体反例:
f = MaybeT [Nothing] :: MaybeT [] (Int -> Int) a = MaybeT [Just 1, Just 2, Nothing] :: MaybeT [] Int f <*> a = [Nothing, Nothing, Nothing] do x <- f y <- a return (x y) = [Nothing]
可以看到,<*>的计算结果是[Nothing, Nothing, Nothing],而通过Monad的do表达式推导的结果是[Nothing],二者并不一致。
由此产生两个疑问:
- 既然存在这种不一致,日常开发中如何混用
>>、*>、>>=、<*>等操作符? - 为何大量使用MaybeT的Haskell代码并未出现相关bug?
内容的提问来源于stack exchange,提问作者kwonryul
相关产品推荐
相关产品推荐

