gpt4 book ai didi

haskell - 为什么这不是受限制的单子(monad)限制的情况?

转载 作者:行者123 更新时间:2023-12-03 14:27:20 24 4
gpt4 key购买 nike

在下面的代码片段中,我最初认为有一个受限的 monad 错误(我忘记在 Monad m => 定义中添加 instance Monad (Transform m a))。读了很多关于受限单子(monad)的文章后,我想知道为什么这里碰巧没问题:

{-# LANGUAGE GADTs #-}

data Next a where
Todo :: a -> Next a
Done :: Next a

instance Functor Next where
fmap f Done = Done
fmap f (Todo a) = Todo (f a)

data Transform m a b = Monad m => Transform ( m(Next a) -> m(Next b) )

instance Functor (Transform m a) where
fmap f (Transform ta) = Transform tb where
tb ma = ta ma >>= return . (fmap f)

instance Applicative (Transform m a) where
pure = return
mf <*> ma = do
f <- mf
a <- ma
return (f a)

instance Monad m => Monad (Transform m a) where
return b = Transform (t b) where
t b _ = return $ Todo b
(Transform t) >>= f = Transform (\ma -> do
a <- ma
case a of
Done -> return Done
--Todo a' -> ...
)

这个例子相当做作,我去掉了所有不相关的部分。 (手头的实际问题与 this 相关。)关键部分是 Monad m Transform 中的限制.

我不太明白这与经常引用的规范 Set 有何不同。 -as-a-monad 示例,它确实表现出受限的 monad 限制。

最佳答案

Transform不是受限制的单子(monad)。

Set . Set在它的一个论点中是一元的,除了所说的论点需要是 Ord .也就是说,Set是 Hask 子类别中的一个单子(monad),所有对象都在 Ord 中.

但是Transform首先不是一个单子(monad)。 Transform :: (* -> *) -> * -> * -> * , 但是 Monad适用于实物* -> * (如果您要成为完整的范畴理论家,那么单子(monad)通常是内仿函数,对于某些 k -> k 应该大致具有 k 的种类,但是 Transform 也不真正适合更广泛的模板)。单子(monad)是Transform m am是一个单子(monad)。 Transform m a是所有 Hask 上的 monad,只要 m也是一个单子(monad)。你看出区别了吗? Transform m a给定 Monad m适用于所有类型。但是我无法在空白处填写“Set 给定 ___ 对所有类型都有效”,因为限制在 Set 的参数上。是一元的,而 Transform m a对它是一元的类型没有限制,但对构成它的类型之一没有限制。

关于haskell - 为什么这不是受限制的单子(monad)限制的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51184809/

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