首页 > 解决方案 > 绑定到 Haskell 中数据结构内的 monad

问题描述

有没有办法定义只影响数据结构的一部分的绑定?

例如,假设我们有一个具有名称和结果的模拟计算数据类型。

type Name          = String
data Error         = TimeOut | NotEnoughMemory | DivByZero
type Result a      = Either Error a
data Computation a = Computation Name (Result a)

由于计算可能会失败,但我们可能仍然对其名称感兴趣,因此它不能是 Result 的一部分,而必须是 Computation 的一部分。另一方面,直接绑定和验证计算结果也很方便,就像使用常规的 Either 类型一样。有没有办法做到这一点?

标签: haskell

解决方案


不,您可能无法定义任何有用instance Monad Computation的 ,因为您无法pure :: a -> Computation aApplicative类(它是 的超类Monad)中定义;您将如何实例化Name给定的类型值a

这是一个Functor虽然(你可以自动推导出它)。有了更多的上下文,可能会有一个更有用的不同抽象。


推荐阅读