在演讲和写作中,我一直想参考monad中的数据,但我不知道该怎么称呼它。
例如,在Scala中,传递给flatMap
的函数的参数被绑定到......呃...... monad中的那个东西。在:
List(1, 2, 3).flatMap(x => List(x, x))
x
受限于那个我没有说话的东西。
稍微复杂一点,传递给Kleisli箭头的参数不一定会绑定到 all monad中的数据。使用List
,Set
,Stream
以及许多其他monad,flatMap
多次调用Kleisli箭头,将x
绑定到不同的数据部分每次在monad里面。或者甚至不是“数据”,只要遵循monad法则。无论它是什么,它都包裹在monad中,而flatMap
在没有包装器的情况下传递给你,也许一次只有一件。我只是想知道在x
引用的相关内部monad内容的内容,至少在某种程度上,所以我可以阻止所有这些愚蠢的语言。
这个东西/数据/价值/东西/它是什么的标准或传统术语?
如果没有,“糖果”怎么样?
答案 0 :(得分:17)
试着说" x
被绑定到"让你失败。让我解释一下,并指导你在谈论这些事情时更好地表达自己。
假设我们有:
someList.flatMap(x => some_expression)
如果我们知道someList的类型为List[Int]
,那么我们可以放心地说some_expression中的,x
绑定到Int
类型的值。注意some_expression"内部的警告,#34;。这是因为,给定someList = List(1,2,3)
,x
将依次采用每个值:1
,2
和3
。
考虑一个更通用的例子:
someMonadicValue.flatMap(x => some_expression)
如果我们对someMonadicValue
一无所知,那么我们就不太了解some_expression
将如何被调用。它可以运行一次,或三次(如上例所示),或者懒洋洋地,或者异步运行,或者可以安排一次someMonadicValue完成(例如,期货),或者它可能永远不会被使用(例如空列表,无)。 Monad界面不包括关于何时或如何使用someExpression
的推理。所以,你可以说x
的内容仅限于some_expression
的上下文,只要和然后 some_expression
发生在被评估。
回到这个例子。
someMonadicValue.flatMap(x => some_expression)
你试图说" x
是??? someMonadicValue
。"而你正在寻找准确替换???的词。好吧,我在这里告诉你,你做错了。如果你想谈论x
,那么要么就这样做
some_expression
的范围内。在这种情况下,请使用我在上面给出的粗体短语:"在some_expression内部,x
绑定到类型Foo
的值。"或者,您也可以谈论x
... 如果是#2,例如someList.flatMap(x => some_expression)
,您可以说" x
是someList
的每个元素。"对于someFuture.flatMap(x => some_expression)
,您可以说" x
是someFuture
的成功未来值,如果它确实完成并成功的话。"
你知道,这是Monads的美丽。 那???你试图描述的是Monad界面抽象的东西。现在你明白为什么这么难给出???一个名字?这是因为它对每个特定的monad都有不同的名称和不同的含义。并且是拥有Monad抽象的重点:在同一计算界面下统一这些不同的概念。
答案 1 :(得分:1)
免责声明:我绝对不是函数式编程术语的专家,我希望从你的角度来看,以下内容不能解决你的问题。对我而言,问题在于:如果选择一个术语需要专业知识,理解也是如此。
选择合适的术语在很大程度上取决于:
关于语言的正确性,问题在于您是否正确地想要引用绑定到x
的值/数据,或者您是否可以使用某个(不正确的)抽象。就观众而言,我主要区分具有强大功能编程背景的观众和来自其他编程范例的观众。在前者的情况下,选择该术语可能并不完全是至关重要的,因为概念本身是熟悉的,并且许多术语将导致正确的关联。评论中的讨论已经包含了一些针对此案例的非常好的建议。但是,讨论还表明,你需要在函数式编程中有一定的背景才能看到一些术语背后的基本原理。
对于没有函数式编程背景的读者,我宁愿牺牲语言的正确性来支持可理解性。在这种情况下,我经常将它称为“底层类型”,只是为了避免任何混淆,我可能会通过尝试引用“monad中的东西”本身来创建。显然,说“x
绑定到底层类型”确实是错误的。但是,对我而言,我的观众完全理解一个概念更为重要。由于大多数程序员都熟悉容器及其底层类型,因此我的目标是(有缺陷的)关联“底层类型”=> “容器中的东西”=> “monad中的东西”,这通常似乎有效。
TL; DR:在正确性和可访问性之间始终存在权衡。当谈到函数式编程时,将偏见转向后者是有帮助的。
答案 2 :(得分:1)
flatMap
并未多次调用Kleisli箭头。而“那件事”并不是“内部”的单子。
flatMap
将Kleisli箭射向monad。您可以将此作为箭头M[A] => M[B]
的构造在类型(A
,B
)之间提升为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
操作的结果。