【问题标题】:What is the name of this monad-like functional programming pattern?这种类似 monad 的函数式编程模式叫什么名字?
【发布时间】:2011-10-31 10:07:42
【问题描述】:

我偶尔会在代码中遇到类似于 monad 但 不会在 >>= 中保持一致的类型。

这是我能想到的最简单的例子:

(首先是一些类型级别的布尔值:

data TyT = TyT
data TyF = TyF

class TyOr a b c | a b -> c

instance TyOr TyF TyF TyF
-- rest similarly

)

现在这是我们的“monad”类型构造函数:

data Marked p a = Marked a
    deriving (Show)

对于给定的pMarked p 是一个 * -> *,其行为非常类似于 m monad,但不同,接下来会出现,当我们定义“绑定”时:

(>>%) :: (TyOr p q r) => Marked p a -> (a -> Marked q b) -> Marked r b
(Marked x) >>% f = Marked y where Marked y = f x

这里不同的是>>%的结果类型不同 构造函数比参数。除此之外,它基本上是一个单子。

我们可以这样使用它:

a :: Marked TyF Int
a = Marked 5

f :: Int -> Marked TyT Int
f x = Marked (x + 1)

ghci> a >>% f
Marked 6

ghci> :t a >>% f
a >>% f :: Marked TyT Int

(这是受到outis's observation that Python's "with" can't be a monad because it changes the type 的启发,但我以其他(更简单)的方式看到它 也)。

【问题讨论】:

  • (>>%) 的类型签名看起来更接近flip (<*>) :: Applicative f => f a -> (f a -> f b) -> f b 而不是(>>=) :: Monad m => m a -> (a -> m b) -> m b,所以我会说这更像是应用程序而不是单子。
  • 你是对的。我实际上想将其修复为更像单子,即使我并不是真正“使用”单子。我会编辑它。虽然我对 Applicatives 有或多或少相同的问题。
  • Google 搜索“Indexed Monad”、“Monadish”或“Monadic Region”。

标签: design-patterns haskell functional-programming monads


【解决方案1】:

嗯,它在某种意义上与 monad 密切相关,只是与 Monad 类型类不兼容。特别是,我们可以注意到以下相似之处:

  • Monoid 具有关联运算,其标识定义在一致类型的值上:mappend :: a -> a -> amempty :: a

  • Monad 具有关联操作,其标识在 类型构造函数上定义,例如:join :: m (m a) -> m areturn :: a -> m a

  • 函数——实际上,一个类别中的箭头——具有关联操作和标识,但关联操作由类别的对象索引,这里的意思是“类型” :(.) :: arr b c -> arr a b -> arr a cid :: arr a a

...那么 join 按类型索引的 monad 会是什么?嗯。

一些您可能会发现有趣的参考资料,探索相关概念:


post scriptum -- 你在对这个问题的评论中这么说:

你是对的。我实际上想将其修复为更像单子,即使我并不是真正“使用”单子。我会编辑它。虽然我对 Applicatives 有或多或少相同的问题。

实际上,将事情限制在Applicative 变化非常重要! a -> Marked p bMarked p (a -> b) 的区别在于,在前者中,Marked p 结构的属性可以依赖于a 参数;而在后者中,标记与函数的参数无关。独立意味着两者可以分开处理,大大简化了事情;注意到a 类型的任何值都与() -> a 类型的函数同构,您可以直接将其转换为Arrow 的某种两层版本。

另一方面,涉及Monad 意味着函数和标记上下文之间存在某种程度的交错,这使事情变得复杂,原因类似于discussed in the answers to this question

【讨论】:

  • 我认为,到目前为止,我所看到的那些(前两个)确实在谈论与我相同的事情。所以我猜它没有一个公认的名字。
  • @Owen:它们之间存在一些差异,但基本思想都在某种程度上相似。你所追求的是,​​至少,类似的相关。但是,是的,我不知道有任何知名的名字。我认为,“索引”或“参数化”作为“monad”的修饰符是最常见的,但对于哪种方法的含义有些不一致。
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 2016-09-13
  • 2016-02-06
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
相关资源
最近更新 更多