Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 这个类monad函数式编程模式的名称是什么?_Design Patterns_Haskell_Functional Programming_Monads - Fatal编程技术网

Design patterns 这个类monad函数式编程模式的名称是什么?

Design patterns 这个类monad函数式编程模式的名称是什么?,design-patterns,haskell,functional-programming,monads,Design Patterns,Haskell,Functional Programming,Monads,我偶尔会在代码中遇到一种模式,它类似于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 (Sh

我偶尔会在代码中遇到一种模式,它类似于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)
对于给定的
p
标记的p
是一个
*->*
,其作用非常类似于 monad,但与下面定义“bind”时发生的情况不同:

这里的不同之处在于,
>%
的结果具有不同的类型 构造函数,而不是参数。除此之外,它基本上是单子

我们可以这样使用它:

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
(这本书的灵感来源于,但我从其他(更简单的)方面看到了它
在某种意义上,它与Monad密切相关,只是与Monad类型类不兼容。特别是,我们可以注意到以下相似之处:

  • 幺半群具有在一致类型的值上定义标识的关联操作:
    mappend::a->a->a
    mempty::a

  • monad有一个在类型构造函数上定义了标识的关联操作,例如:
    join::m(ma)->ma
    return::a->ma

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

…那么,按类型索引其
join
的monad将是什么呢?嗯

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

  • 无限的邻域:
  • via Lambda终极版:
  • 科摩纳德阅读器:
  • 奥列格:
  • via Lambda终极版:

post scriptum--您在对问题的评论中说:


你说得对。我实际上想把它改成更像单子的样子,尽管我并没有真正“使用”单子。我会编辑它。虽然我对应用程序或多或少会有相同的问题

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


另一方面,涉及
Monad
意味着函数和标记上下文之间存在某种程度的交错,这使得问题变得复杂,原因与之类似。

类型签名
(>>%)
看起来更接近
翻转()::Applicative f=>fa->(fa->fb)->fb
而不是
(>=)::Monad m=>ma->(a->mb)->mb
,所以我认为这比Monad更像应用程序。你说得对。我实际上想把它改成更像单子的样子,尽管我并没有真正“使用”单子。我会编辑它。虽然我对应用程序或多或少会有相同的问题。谷歌搜索“索引单子”、“单子区”或“单子区”。我认为,我到目前为止看到的(前两个),确实是在谈论我自己。所以我猜它没有一个公认的名字。@Owen:它们之间有一些差异,但基本思想在某种程度上都是相似的。你所追求的,至少,是相似的。但是,是的,我不知道有什么好名字。“索引”或“参数化”作为“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