design-patterns - 这种类似 monad 的函数式编程模式叫什么名字?

标签 design-patterns haskell functional-programming monads

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

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

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

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)

对于给定的 p , Marked p* -> *其行为非常类似于 m在一个
monad,但不同的是,当我们定义“绑定(bind)”时,接下来会发生:
(>>%) :: (TyOr p q r) => Marked p a -> (a -> Marked q b) -> Marked r b
(Marked x) >>% f = Marked y where Marked y = f x

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

我们可以这样使用它:
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 的启发,但我以其他(更简单)的方式看到它
也)。

最佳答案

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

  • Monoids 有一个关联运算,其身份定义在一致类型的值上: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 .

  • ...那么一个单子(monad)会是什么 join是按类型索引的吗?嗯。

    您可能会发现一些有趣的引用资料,探索相关概念:
  • 无限邻域:Beyond Monads
  • 通过终极 Lambda:Parameterized Notions of Computation
  • The Comonad. 读者:Parameterized Monads in Haskell
  • 奥列格:Variable (type) State "Monad"
  • 通过终极 Lambda:Kleisli Arrows of Outrageous Fortune


  • 发布脚本-您在对该问题的评论中说:

    You're right. I actually want to fix that to be more monad-like though, even though I'm not really "using" monads. I'll edit it. Though I would have more or less the same question about Applicatives.



    实际上,将事情限制在 Applicative变化很重要! a -> Marked p b 之间的区别和 Marked p (a -> b)是,在前者中,Marked p 的属性结构可以依赖于 a范围;而在后者中,标记与函数的参数无关。独立意味着两者可以分开处理,大大简化了事情;注意 a 类型的任何值与 () -> a 类型的函数同构,你可以把它变成某种两层版本的Arrow以直截了当的方式。

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

    关于design-patterns - 这种类似 monad 的函数式编程模式叫什么名字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135540/

    相关文章:

    java - 如何验证生成的 Java 代码的语法?

    haskell - 我可以用 callCC 做什么而不能用 cont 完成?

    java - 映射getOrDefault VS getOrUseSupplier

    java - GUI 层 vs 代码层 vs Swing

    c++ - 对基于 I/O 的对象执行一系列操作的设计模式

    xml - 在 Haskell 中解析 XML

    math - 我应该如何在 Haskell 中实现凯莱表?

    lambda - fun 关键字在 Coq 中的作用是什么?

    javascript - 如何使用 ramda 柯里化(Currying)多个参数而不专门调用返回函数

    java - 根据变量选择实现(类)