【问题标题】:Is access to the internal structure of a monad required for a monad transformer?monad 转换器是否需要访问 monad 的内部结构?
【发布时间】:2012-08-03 08:43:11
【问题描述】:

是否有必要访问内部结构 一个 monad 来编写 monad 转换器?

例如:我想要 GetT - 来自 Data.Binary.Get 的 Get monad 的转换器, 但是这个模块不会暴露Get monad 的内部结构。是不是意味着唯一 我的方法是将GetT 直接添加到Data.Binary.Get 模块?

【问题讨论】:

  • 我认为通常情况正好相反。定义 monad 真正实现的是 monad 转换器,然后将其应用于 Identity monad 以获得该 monad 的“基本”实例(例如,将 StateT 应用于 Identity 以获取 @ 987654328@)。当心,我不确定这个:)

标签: haskell monads monad-transformers


【解决方案1】:

一般来说,是的。在这个例子中看看内部 monad(这里是 list monad)如何“撤销”外部 monad 的“早期”动作的效果:

> execWriterT (tell "Hi" >> tell "Ho" >> lift [()])
["HiHo"]
> execWriterT (tell "Hi" >> tell "Ho" >> lift [])
[]

现在假设您可以将每个 monad 变成一个 monad 转换器。然后你就可以构造一个IOT monad 转换器,它可以发射导弹,但随后又撤消了它:

> execIOT (launchMissile >> lift [])

因此,在不查看定义的情况下,不可能将任意 monad 转换为 monad 转换器。

【讨论】:

  • 我是否理解正确,您以这个案例为例,您不需要有关内部结构的信息?但是你实际上使用了内部单子是列表的事实。
  • 否;有问题的内部结构是您想要变成变压器的 monad 的内部结构,在本例中为 IO(在您的情况下为 Get)。您永远不需要有关要包装的 monad 的内部结构的信息。这就引出了一个问题,为什么你首先想要一个GetT 变压器,即你想要实现什么?
  • 我有一些代码,我使用 Handler 通过套接字进行通信。
  • 如果问题是“是否可以访问编写 monad 转换器所需的内部结构”,答案不是“是”吗?
  • @VictorDenisov - 考虑到这些要求,您可能想要研究各种迭代风格中的一种(迭代、导管、管道、许多选项)。这个问题几乎直接存在于他们的设计空间中。
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2018-02-06
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多