gpt4 book ai didi

haskell - Monad 转换器的用途和示例?

转载 作者:行者123 更新时间:2023-12-03 04:45:11 24 4
gpt4 key购买 nike

我正在讨论 Monad Transformers,我知道它们的主要作用是提供一个 Monadic 容器来保存不同类型的 monad,它提供了一个通用接口(interface),可以在计算中操作“嵌套”monad。

我尝试实现自己的变压器:

data CustomTransformer a = CustomTransformer

class TransformerClass m a where
lift :: m a -> CustomTransformer (m a)

instance TransformerClass Maybe a where
lift (Just a) = CustomerTransformer (Just a)

正在经历this纸,我明白这是不正确的。他们的例子显示:

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

这会将操作 a 嵌套在 monad 转换器 r m 中。

我不明白如何使用单子(monad)转换器帮助处理计算中的多个单子(monad)类型?谁能提供一个简单的解释和例子?

最佳答案

我发现了解这里起作用的类型很有帮助。

首先,如您所知,monad 是一个 类型构造函数 m::* -> * 与两个操作配对,return::a -> m a(>>=)::m a -> (a -> m b) -> m b

class Monad (m :: * -> *) where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b

monad 转换器的想法是,它们是一种类型级函数,可以将一个 monad 转换为另一个 monad。因此,鉴于 monad 是单参数类型构造函数 * -> *,monad 转换器必须是一种类型 (* -> *) -> (* -> *) (* -> *) -> * -> * 删除括号后。 monad 转换器是一个双参数类型,其第一个参数是一个 monad,第二个参数是一个值。

更具体地说,一个 monad 转换器是一个类型 t::(* -> *) -> * -> *,这样只要 m 是一个 monad t m 也是一个 monad。我们还要求 t m 是一个比 m 更大的单子(monad),从某种意义上来说,m 中的任何 Action 都可以是嵌入t m

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

我正在使用the "entailment" operator :-来自Kmett's constraints packagetransform的定义中; transform 证明了 m 是一个 Monad 意味着 t m 是一个 Monad 。 (The version of MonadTrans in transformers 省略了 transform 成员,因为在编写它时 GHC 不支持 :- 运算符。)

重要的是,t m a(又名(t m) a)的含义与t (m a)不同。前者是应用于 ma 的双参数类型 t。后者是应用于 m a 的单参数类型 t

一个非常简单的 - 因为我在手机上 - monad 转换器定义的示例:

newtype IdentityT m a = IdentityT { runIdentityT :: m a }

instance Monad m => Monad (IdentityT m) where
return = IdentityT . return
IdentityT m >>= f = IdentityT $ m >>= (runIdentityT . f)

instance MonadTrans IdentityT where
transform = Sub Dict
lift = IdentityT

请注意,IdentityT 是一个双参数数据类型;第一个参数 m::* -> * 是 monad,第二个参数 a::* 是常规类型。

ghci> :k IdentityT
IdentityT :: (* -> *) -> * -> *

关于haskell - Monad 转换器的用途和示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200878/

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