你把monad里面的数据称为什么?

时间:2014-06-09 19:07:26

标签: scala haskell functional-programming terminology monads

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

例如,在Scala中,传递给flatMap的函数的参数被绑定到......呃...... monad中的那个东西。在:

List(1, 2, 3).flatMap(x => List(x, x))

x受限于那个我没有说话的东西。

稍微复杂一点,传递给Kleisli箭头的参数不一定会绑定到 all monad中的数据。使用ListSetStream以及许多其他monad,flatMap多次调用Kleisli箭头,将x绑定到不同的数据部分每次在monad里面。或者甚至不是“数据”,只要遵循monad法则。无论它是什么,它都包裹在monad中,而flatMap在没有包装器的情况下传递给你,也许一次只有一件。我只是想知道在x引用的相关内部monad内容的内容,至少在某种程度上,所以我可以阻止所有这些愚蠢的语言。

这个东西/数据/价值/东西/它是什么的标准或传统术语?

如果没有,“糖果”怎么样?

6 个答案:

答案 0 :(得分:17)

试着说" x被绑定到"让你失败。让我解释一下,并指导你在谈论这些事情时更好地表达自己。

假设我们有:

someList.flatMap(x => some_expression)

如果我们知道someList的类型为List[Int],那么我们可以放心地说some_expression中的x绑定到Int类型的值。注意some_expression"内部的警告,#34;。这是因为,给定someList = List(1,2,3)x将依次采用每个值:123

考虑一个更通用的例子:

someMonadicValue.flatMap(x => some_expression)

如果我们对someMonadicValue一无所知,那么我们就不太了解some_expression将如何被调用。它可以运行一次,或三次(如上例所示),或者懒洋洋地,或者异步运行,或者可以安排一次someMonadicValue完成(例如,期货),或者它可能永远不会被使用(例如空列表,无)。 Monad界面不包括关于何时或如何使用someExpression的推理。所以,你可以说x的内容仅限于some_expression的上下文,只要和然后 some_expression发生在被评估。

回到这个例子。

someMonadicValue.flatMap(x => some_expression)

你试图说" x是??? someMonadicValue。"而你正在寻找准确替换???的词。好吧,我在这里告诉你,你做错了。如果你想谈论x,那么要么就这样做

  1. some_expression的范围内。在这种情况下,请使用我在上面给出的粗体短语:"在some_expression内部,x绑定到类型Foo的值。"或者,您也可以谈论x ...
  2. 了解您正在处理的monad。
  3. 如果是#2,例如someList.flatMap(x => some_expression),您可以说" xsomeList的每个元素。"对于someFuture.flatMap(x => some_expression),您可以说" xsomeFuture的成功未来值,如果它确实完成并成功的话。"

    你知道,这是Monads的美丽。 那???你试图描述的是Monad界面抽象的东西。现在你明白为什么这么难给出???一个名字?这是因为它对每个特定的monad都有不同的名称和不同的含义。并且是拥有Monad抽象的重点:在同一计算界面下统一这些不同的概念。

答案 1 :(得分:1)

免责声明:我绝对不是函数式编程术语的专家,我希望从你的角度来看,以下内容不能解决你的问题。对我而言,问题在于:如果选择一个术语需要专业知识,理解也是如此。

选择合适的术语在很大程度上取决于:

  • 您理想的语言正确程度,
  • 您的受众群体,以及某些术语的相应内涵。

关于语言的正确性,问题在于您是否正确地想要引用绑定到x的值/数据,或者您是否可以使用某个(不正确的)抽象。就观众而言,我主要区分具有强大功能编程背景的观众和来自其他编程范例的观众。在前者的情况下,选择该术语可能并不完全是至关重要的,因为概念本身是熟悉的,并且许多术语将导致正确的关联。评论中的讨论已经包含了一些针对此案例的非常好的建议。但是,讨论还表明,你需要在函数式编程中有一定的背景才能看到一些术语背后的基本原理。

对于没有函数式编程背景的读者,我宁愿牺牲语言的正确性来支持可理解性。在这种情况下,我经常将它称为“底层类型”,只是为了避免任何混淆,我可能会通过尝试引用“monad中的东西”本身来创建。显然,说“x绑定到底层类型”确实是错误的。但是,对我而言,我的观众完全理解一个概念更为重要。由于大多数程序员都熟悉容器及其底层类型,因此我的目标是(有缺陷的)关联“底层类型”=> “容器中的东西”=> “monad中的东西”,这通常似乎有效。

TL; DR:在正确性和可访问性之间始终存在权衡。当谈到函数式编程时,将偏见转向后者是有帮助的。

答案 2 :(得分:1)

flatMap并未多次调用Kleisli箭头。而“那件事”并不是“内部”的单子。

flatMap将Kleisli箭射向monad。您可以将此作为箭头M[A] => M[B]构造在类型(AB)之间提升为monad(M[A],{{ 1}}),给出一个Kleisli箭头M[B]

A => M[B]中的x是被取消的值。

答案 3 :(得分:1)

什么数据?

data Monady a = Monady

monad的值是monad的值,它们的包装类型可能完全是虚构的。也就是说,谈论它就好像它存在可能会让你痛苦。

您想要谈论的是像Monad m => a -> m b这样的延续,因为它们保证存在。有趣的事情发生在(>>=) 使用这些延续的方式中。

答案 4 :(得分:0)

'项目' 似乎不错? '项目参数' 如果您需要更具体。

源数据可以包含多个项目,或者操作可以多次调用它。对于第一种情况,元素倾向于更具体,对于源和是单数的。对列表用法不敏感,但 Item 正确涵盖了所有情况。

免责声明:我对可理解的英语了解更多,而不是关于FP。

答案 5 :(得分:0)

在这里退后一步。

monad并不仅仅是包含值m的仿函数a。 monad是endofunctors的堆栈(即m' s的组合),以及join运算符。这就是着名的quip - monad是endofunctor类别中的monoid,问题是什么? - 来自。

(整个故事是,quip意味着m的构成是另一个m,见join

类型(m a)的东西通常称为monad动作。您可以致电a操作的结果