gpt4 book ai didi

haskell - 为什么 monad 转换器不被限制为产生 monad?

转载 作者:行者123 更新时间:2023-12-02 00:36:56 25 4
gpt4 key购买 nike

MonadTrans类:

class MonadTrans t where
-- | Lift a computation from the argument monad to the constructed monad.
lift :: Monad m => m a -> t m a

为什么 t m 不被限制为 Monad?即,为什么不:

{-# LANGUAGE MultiParamTypeClasses #-}
class Monad (t m) => MonadTrans t m where
lift :: Monad m => m a -> t m a

如果答案是“因为事情就是这样”,那也没关系,只是让 n008 感到困惑。

最佳答案

您提出了以下建议:

class Monad (t m) => MonadTrans t m where
lift :: Monad m => m a -> t m a

...但这真的意味着你想要的吗?看来你想表达类似“类型 t 可能是 MonadTrans 的实例,如果对于所有 m::* -> *其中mMonad的实例,t m也是Monad的实例”。

上面的类定义实际上所说的更像是“类型tm可能构成MonadTrans的实例 如果对于这些特定类型,t mMonad 的实例”。仔细考虑差异,以及可能不是您想要的实例的隐含潜力。

在一般情况下,类型类的每个参数都是一个独立的“参数”,当人们尝试使用 MPTC 时,这一事实一直是令人头痛和 GHC 扩展的丰富来源。

这并不是说这样的定义无论如何都不能使用——正如您所指出的,当前的定义也不理想。古老的问题“为什么Data.Set 不是一个Functor”与之相关,这些问题助长了最近的ConstraintKinds 愚蠢行为。

这里“为什么不”的最终答案几乎肯定是 Daniel Fischer 在评论中给出的答案 - 因为 MonadTrans 是非常核心的功能,因此不希望让它依赖于某些功能越来越神秘的 GHC 扩展的可怕级联。

关于haskell - 为什么 monad 转换器不被限制为产生 monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13686714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com