使用Haskell的map函数来计算列表的总和
||
哈斯克尔
addm::[Int]->Int
addm (x:xs) = sum(x:xs)
我能够使用sum
函数来获取列表的总和,但是是否可以使用map
函数来获取列表的总和?还可以使用map功能吗?
没有找到相关结果
已邀请:
8 个回复
才脊烽馈低
来递增列表中的每个值,例如
实现addm的另一种方法是使用foldl:
疾很毋悲
来定义impossible1ѭ不可能的定义:
这实际上显示了如何用
(以及
和
)来实现
,上面的等价于
:
我希望可以用
来计算许多事情,从而安排通过
的各种信息流。 编辑:以上只是变相的
(and18ѭ有点像
):
这似乎表明
比
更通用。
室邢
将列表减少到其总和。该递归模式为
。
顺便说一句,请注意,您也可以将
定义为折叠:
这是因为ѭ29是列表上的规范递归函数。 参考文献:关于折叠的通用性和表达性的教程,Graham Hutton,J.Functional Programming 9(4):355–372,1999年7月。
铰齐插
来获得列表的总和,但是您可以使用单声道版本
来获得总和。您所需要做的就是在
monoid(请参阅LYAHFGG)上使用
monad(请参阅LYAHFGG)。 我写了一个专门的版本,可能更容易理解:
只是某种类型的包装,它也保留一个“运行总和”。我们可以将
变成单子,并在此完成一些工作:当执行
(又名“ bind \”)操作时,它将返回新的结果以及该结果的运行总和的值加上原始运行总和。
函数采用一个Int并创建一个
,该参数将那个参数同时包含为包装值和运行总和(实际上,我们对该值不感兴趣,而仅对总和部分感兴趣)。然后,在
中,
可以发挥其神奇作用:虽然它对嵌在monad中的值的作用类似于
,但它执行“38ѭ之类的\” monadic \“函数,并链接这些调用(它使用
进行此操作)。在这一点上,我们通过monad的“后门”了解标准
缺失的列表元素之间的相互作用。
惜堡沁戚
这将返回正方形列表。 要汇总列表中的所有元素,请使用fold:
+是您要应用的函数,0是初始值(0代表总和,1代表乘积等)
肉簧咸缮
函数之一。但是,可以用命令式语言编写类似于a49ѭ循环的内容:
它将列表的前两个元素加在一起,直到最后得到一个元素列表,然后返回该值(使用
)。
玩翁文醚碱
我相信它会为列表中的每个项目返回常数1,并返回总和! 可能不是最佳的编码实践,但这是我的教授给我们学生的一个例子,似乎与这个问题很好地联系在一起。
豪抱怒掳
永远不是用来汇总容器元素的主要工具,就像螺丝刀永远不能是观看电影的主要工具一样。但是您可以使用螺丝刀来固定电影放映机。如果你真的想要,你可以写
当然,这很愚蠢。您可以获得更通用,可能更有效的版本:
或更佳的选择是使用
,因为它确实适合工作。