gpt4 book ai didi

scala - 你把包裹在单子(monad)里的数据叫做什么?

转载 作者:行者123 更新时间:2023-12-03 12:49:55 24 4
gpt4 key购买 nike

在演讲和写作中,我一直想引用 monad 中的数据,但我不知道该怎么称呼它。

例如,在 Scala 中,函数的参数传递给 flatMap被绑定(bind)到……呃……monad里面的那个东西。在:

List(1, 2, 3).flatMap(x => List(x, x))
x被束缚在我无话可说的那件事上。

让事情有点复杂的是,传递给 Kleisli 箭头的参数不一定会绑定(bind)到 monad 内的所有数据。与 List , Set , Stream ,以及许多其他单子(monad), flatMap多次调用克莱斯利箭,绑定(bind) x每次都指向 monad 内的不同数据。或者甚至可能不是“数据”,只要遵循单子(monad)定律。不管它是什么,它都被包裹在 monad 中,并且 flatMap把它不带包装地传给你,也许一次一张。我只想知道如何调用相关的内部单子(monad)内容 x至少部分指的是,所以我可以停止所有这些笨拙的语言。

这个东西/数据/值(value)/东西/不管它是什么,是否有一个标准或传统的术语?

如果没有,那“糖果”呢?

最佳答案

试图说“x 被绑定(bind)”会让你失败。让我解释一下,并引导您在谈论这些事情时以更好的方式表达自己。

假设我们有:

someList.flatMap(x => some_expression)

如果我们知道 someList 的类型为 List[Int] , 那么我们可以有把握地说 在 some_expression 中,x绑定(bind)到 Int 类型的值. 请注意“在 some_expression 内部”的警告。这是因为,给定 someList = List(1,2,3) , x将采用它们中的每一个的值: 1 , 2 , 和 3 , 反过来。

考虑一个更普遍的例子:
someMonadicValue.flatMap(x => some_expression)

如果我们对 someMonadicValue 一无所知,那么我们对 some_expression 的了解并不多。将被调用。它可能运行一次或三次(如上面的示例),或者延迟运行,或者异步运行,或者它可能在 someMonadicValue 完成后被调度(例如 future ),或者它可能永远不会被使用(例如空列表,无)。 Monad 接口(interface)不包括关于何时或如何的推理 someExpression将会被使用。所以你能说的都是 x将被限制在 some_expression 的上下文中, 无论何时何地 some_expression恰好被评估。

所以回到例子。
someMonadicValue.flatMap(x => some_expression)

您想说“ xsomeMonadicValue 的 ???”。而您正在寻找准确替换 ??? 的词。好吧,我在这里告诉你,你做错了。如果你想谈谈 x , 然后要么做
  • some_expression 的范围内.在这种情况下,请使用我上面给你的粗体短语:“在 some_expression 内部,x 绑定(bind)到 Foo 类型的值。”或者,您也可以谈论 x ...
  • 有了关于你正在处理哪个 monad 的额外知识。

  • 例如,在情况 #2 中,对于 someList.flatMap(x => some_expression) ,您可以说“ xsomeList 的每个元素。”对于 someFuture.flatMap(x => some_expression) ,您可以说“ xsomeFuture 的成功 future 值,如果它确实完成并成功的话。”

    你看,这就是 Monads 的美妙之处。 那 ???你试图描述的,是 Monad 接口(interface)在 上抽象出来的东西。 .现在你明白为什么给予如此困难了吗???一个名字?这是因为对于每个特定的 monad,它具有不同的名称和不同的含义。这就是 Monad 抽象的意义所在:在同一个计算接口(interface)下统一这些不同的概念。

    关于scala - 你把包裹在单子(monad)里的数据叫做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127190/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com