当前位置: 首页 > 知识库问答 >
问题:

用Join()代替Bind()的单子

仇飞鹏
2023-03-14

单子通常依次解释returnbind。但是,我认为您也可以通过join实现bind(以及fmap?)

在缺乏一流函数的编程语言中,bind非常难以使用。另一方面,join看起来很容易。

但是,我不能完全理解join是如何工作的。显然,它具有[Haskell]类型

join :: Monad m => m (m x) -> m x

单子连接函数

有人能用returnfmapjoin描述一些常见单子的实现吗?(即根本不提>>=。)我想也许这能帮助我沉入我愚蠢的大脑...

共有1个答案

狄宏大
2023-03-14

在不深入研究隐喻的情况下,我建议将一个典型的单子M读为“生成a的策略”,因此M value类型是第一类“生成a值的策略”。计算或外部交互的不同概念需要不同类型的策略,但一般概念需要某种规则结构才能有意义:

  • 如果您已经有了一个值,那么您就有一个策略来生成一个值(return::v->m v),该值除了生成您所拥有的值之外什么也不包含;
  • 如果您有一个函数可以将一种值转换为另一种值,您可以将它提升到策略(fmap::(v->u)->mv->mu),只需等待策略交付其值,然后将其转换;
  • 如果您有一个策略来生成一个策略来生成一个值,那么您可以构造一个策略来生成一个值(join::m(mv)->mv),该策略遵循外部策略直到生成内部策略,然后遵循内部策略一直到一个值。

让我们举一个例子:叶标二叉树······

data Tree v = Leaf v | Node (Tree v) (Tree v)
instance Monad Tree where
  return = Leaf

产生策略的策略是一棵树,上面有树叶:我们可以把每一片树叶嫁接到标记它的树上,代替每一片树叶。

  join (Leaf tree) = tree
  join (Node h t)  = Node (join h) (join t)

...当然,我们有fmap,它只是重新标记叶子。

instance Functor Tree where
  fmap f (Leaf x)    = Leaf (f x)
  fmap f (Node h t)  = Node (fmap f h) (fmap f t)

下面是一个生成int的策略。

掷硬币:如果是“头”,掷另一枚硬币,在两个策略之间做出决定(分别产生,“掷硬币产生0或产生1”或“产生2”);如果是“tails”产生第三个(“掷硬币产生3个或掷硬币产生4个或5个”)。

我们所利用的是这样一个事实,即“产生价值的战略”本身可以被视为一种价值。在Haskell中,策略作为价值的嵌入是沉默的,但在英语中,我使用引号来区分使用策略和只是谈论它。join运算符表示策略“以某种方式产生并遵循一个策略”,或者“如果您被告知一个策略,您可以使用它”。

(元。我不确定这种“策略”方法是否是思考单子和值/计算区别的一种适当的通用方式,或者只是另一个蹩脚的隐喻。我确实发现树叶标记的树状类型是一种有用的直觉来源,这可能并不奇怪,因为它们是自由单子,结构足以成为单子,但不是更多。)

PS“绑定”的类型

(>>=) :: m v -> (v -> m w) -> m w
mv >>= v2mw = join (fmap v2mw mv)
 类似资料:
  • 问题内容: 我曾经能够用来输出未经消毒的代码(因为消毒发生在服务器端)。 但是现在这个选择消失了吗?我知道我可以使用,但是当不安全易于使用时,将其添加到整个JavaScript上将是一个巨大的痛苦。 我怎么不安全回来? 问题答案: 好吧,仅创建您自己的指令非常简单,这是一个示例。 指令 : 用法 : 演示: http ://jsfiddle.net/cC5VZ/2

  • 问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 简单替换密码是最常用的密码,包括为每个密文文本字符替换每个纯文本字符的算法。 在这个过程中,与凯撒密码算法相比,字母表是混乱的。 例子 (Example) 简单替换密码的密钥通常由26个字母组成。 一个示例关键是 - plain alphabet : abcdefghijklmnopqrstuvwxyz cipher alphabet: phqgiumeaylnofdxjkrcvstzwb 使用

  • 本文向大家介绍yii2简单使用less代替css示例,包括了yii2简单使用less代替css示例的使用技巧和注意事项,需要的朋友参考一下 添加组件php composer.phar require --prefer-dist singrana/yii2-less "*" 修改配置文件`main.php' 在AppAsset中 这样就可以用less来写样式了 以上就是本文的全部内容,希望对大家的学

  • 问题内容: 我知道的指示: JPA持久性机制读取“ persistence.xml”文件,查找名为“ persistence-unit- name”的持久性单元,并基于该持久性单元构造EntityManagerFactory。 我的问题是,如何强制JPA 使用不同于“ persistence.xml”的文件 ?例如“ persistence-test.xml”。 问题答案: 尽管单个JPA提供程序