Sas*_*ser 6 haskell fold accumulate
我有一个基于字母的整数列表.例如:
let charlist = map (ord) "ABCDEF"
Run Code Online (Sandbox Code Playgroud)
charlist 然后看起来如下:
[65,66,67,68,69,70]
Run Code Online (Sandbox Code Playgroud)
我也有三个功能列表:(+),(-)和(*).此示例中的列表如下所示
let funclist = [(+), (-), (*)]
Run Code Online (Sandbox Code Playgroud)
我想在元素之间按顺序应用函数charlist(如果有更多"空格",而charlist不是元素funclist,则从头开始funclist)并从左到右计算最终值,如下所示:
s = ((((((65) + 66) - 67) * 68) + 69) - 70)
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用foldl,但foldl似乎只能使用一个功能.有没有其他方法可以做到这一点?如果可能的话,我想在一个函数中总结整个过程,尽管这不是必需的.
虽然foldl可能只应用一个功能,但您可以在数据中使用不同的功能.诀窍就到合适的连接+,-或*功能您的数据.你是正确的开始:
funclist = [(+), (-), (*)]
Run Code Online (Sandbox Code Playgroud)
但现在让我们制作上面列表的无限版本,比如 [(+), (-), (*), (+), (-), (*)...]
infinite_funclist = cycle funclist
Run Code Online (Sandbox Code Playgroud)
让我们分配我们要折叠的数字.first在这种情况下65,rest是[66..70]
(first:rest) = [65..70]
Run Code Online (Sandbox Code Playgroud)
现在我们一起拉链rest并infinite_funclist获得[(66,(+)), (67,(-)), (68,(*)), (69,(+)), (70,(-))].我们开始first,并且对于每个新元素,我们将当前元组的第二部分中的操作应用于当前值,并将第一部分应用于:
result = foldl' (\acc (v, f) -> acc `f` v) first (zip rest infinite_funclist)
Run Code Online (Sandbox Code Playgroud)
如果我们想要打印结果,我们可以这样做:
main = print result
Run Code Online (Sandbox Code Playgroud)
(链接到这里的代码)