I wonder if Applicative is derived naturally through MonadTransformer's Monad
我花了很长时间才弄清楚MaybeT的Monad和Applicative是否有相同的上下文。正如你在上面的链接中看到的。
“同一语境”的意思是
f <*> a = do
x <- f
y <- a
return (x y)
我为MaybeT找到了一个反例。
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]
因此,似乎MaybeT的应用程序和Monad中存在不一致。
如果有不和谐的话,我们怎么能把〉〉,〉,〉〉= .(〈〉)弄混呢?
真不敢相信,如果有这样的出入,那么目前使用MaybeT的众多Haskell代码中,不应该存在bug吗?
2条答案
按热度按时间z9smfwbn1#
引用一条评论:
MaybeT
的(<*>)
与Compose m Maybe
不同的确:
至于它们的区别,
(<*>)
对于Compose
定义为:[]
和Maybe
),我们可以用它们的monad示例来表示:其中,内部函子为
Maybe
,变为:而
(<*>)
对于MaybeT
是让我们用更接近上面的风格来重新表述右手边:
(<*>)
forCompose
在内部效果之前运行外部效果,因此在您的示例中,您将在外部级别获得通常的列表(<*>)
,获得1 * 3 = 3个元素的列表。运行其第一个参数的效果(外部和内部Maybe
),然后移动到第二个,并且只有当获得Just
时,因此,在你的例子中,Nothing
位于f
中,只会产生另一个Nothing
,最终得到[Nothing]
。flvlnr442#
正如评论中提到的,问题有一个假前提,问题中的两个表述
和
两者产生相同的结果
MaybeT [Nothing]
。你不应该在自然界中找到这两个表达式对于一个类型不同的例子。
这只是对你试图反驳的身份的去糖化。可能有一些单子的例子违反了这条定律,但它们不是“应该”这样做。