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

“绑定”可以在列表单子上做一个缩减吗?

东深
2023-03-14

下面是一些Scala来说明:

scala> // map
scala> List(1,2,3,4,5,6).flatMap {x => List(x * x)}                        
res20: List[Int] = List(1, 4, 9, 16, 25, 36)

scala> // filter    
scala> List(1,2,3,4,5,6).flatMap {x => if (x % 2 == 0) List() else List(x)}
res21: List[Int] = List(1, 3, 5)

哈斯克尔也是如此:

Prelude> -- map
Prelude> [1, 2, 3, 4, 5, 6] >>= (\x -> [x * x])
[1,4,9,16,25,36]

Prelude> -- filter
Prelude> [1, 2, 3, 4, 5, 6] >>= (\x -> if (mod x 2 == 0) then [] else [x])
[1,3,5]

Scheme和Python还有一个reduce函数,该函数通常与mapfilter分组。reduce函数使用提供的二进制函数组合列表的前两个元素,然后将结果组合为下一个元素,依此类推。计算一系列值的总和或乘积的常用用法。下面是一些Python示例:

>>> reduce(lambda x, y: x + y, [1,2,3,4,5,6])
21
>>> (((((1+2)+3)+4)+5)+6)
21

共有1个答案

拓拔迪
2023-03-14

绑定操作的一个定义性质是,结果仍然“在”单子的内部。因此,当您对一个列表执行绑定时,结果将再次是一个列表。由于reduce操作所产生的结果通常不是列表,因此不能用bind操作来表示。

此外,对列表的绑定操作(即concatmap/flatmap)一次只查看一个元素,无法重用前面步骤的结果。因此,即使我们可以将结果包装在一个单元素列表中,也没有办法只使用单子操作来完成它。

所以,如果您有一个类型,除了monad类型类定义的操作之外,不允许对它执行任何操作,那么您永远不能“跳出”monad。这就是木卫一单子工作的原因。

 类似资料:
  • 我有6个输入框,每个输入框有4位数字。输入4位数字后,光标将自动转到下一个输入框。所有这些都是强制性的。 现在,可以在“onChange”事件中将自动聚焦设置为下一个文本框。但如何将这6个输入框的值绑定到表单上的一个字段。我有办法吗?

  • [{codice=欧元,description=欧元,ratio=1},{codice=美元,description=美元,ratio=1.1}] 我想在中转换它,如下所示: {EUR={codice=欧元,description=欧元,ratio=1},USD={codice=美元,description=美元,ratio=1.1}} 但这返回一个而不是我需要的。 我想函数会对我起作用,但不知道

  • 我正在尝试减少阵列流的并行流 我知道合并器用于合并并行流。。但它并没有像我预期的那样工作,因为我得到了如下重复结果:- 那么为什么结果是重复的呢?在累加器中使用数组列表是否线程安全?

  • 问题内容: 我有一个表格,有两个按钮 我也使用jQuery UI的按钮,就像这样 但是,第一个按钮也会提交表单。我本以为,如果没有,它就不会。 显然我可以做到这一点 但是有没有办法可以在没有JavaScript干预的情况下阻止后退按钮提交表单? 老实说,我只使用了一个按钮,因此可以使用jQueryUI设置样式。我尝试调用该链接,但未如预期的那样工作(看起来非常难看!)。 问题答案: 为默认值的属性

  • 我的代码: 产生同样的结果。谁能找出我做错了什么或任何其他方法来实现这一点..谢谢

  • 更新:显然这个特性现在计划在dplyr上使用,正如这里讨论的:https://github.com/tidyverse/dplyr/pull/6145 在SQL中,当验证了给定的情况时,可以分配多个变量,比如var1和var2,构造如下 条件then var1 = x,var2 = y时的情况 dplyr::case_when(或tidyverse中的其他任何东西)是否支持这个有用的功能),如果是