我正在尝试实现“List.fold_left”来计算列表中每个字符的ASCII值(例如['a';'b';'A']),然后将它们相加。
let ascii_sum lst = List.fold_left (fun elem acc -> Char.code(elem) + ... ) 0 lst
在我的代码的“...”中,我正在考虑一种方法来转移到累加器的下一个元素,计算其ASCII值,然后将其值添加到当前的Char.code(elem)。我可能不明白如何正确实现fold_left,尤其是我不太清楚Ocaml中有什么(有趣......),所以你的任何输入对我都有帮助。
谢谢!
答案 0 :(得分:2)
看起来像这样:
(fun arg1 arg2 -> expression)
是一个功能。它需要两个参数(arg1和arg2)并返回表达式的值。
以下是一个例子:
# (fun a b -> a * b) 17 3;;
- : int = 51
此函数将两个参数相乘并返回结果。
List.fold_left
的类型是这样的:
('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
类型'a -> 'b -> 'a
的第一个参数是累积所需答案的函数。请注意,累加器是第一个参数,第二个参数是列表中的一个元素。
如果你看看你的功能,你会发现你的参数倒退了。
一旦你对基本结构感到满意(如类型所示),编写累加器函数就不难了。在您的情况下,您只想返回新的总和。你拥有所需的一切,你只需将它们全部插在一起。
答案 1 :(得分:2)
我正想着一种方法来转移到累加器的下一个元素。
这是你弄错了。您不需要这样做,因为fold_left
会为您执行此操作。
请参阅累加器(匿名函数中的acc
变量)作为中间结果。看看这个例子:
List.fold_left (fun acc elem -> acc + elem) 0 [1;2;3]
它将列表[1;2;3]
中的元素相加,但实际上它是如何实现的:
(我希望这个图表有道理,我把它从头脑中拉出来。)
您需要弄清楚的是实际的函数将返回正确的中间结果。
快速提示:请注意您的类型。在我的示例中,结果与列表中的元素具有相同的类型,而不是您的情况。
快速提示2 :另一种方法是使用
List.map
计算角色的所有ASCII值,然后将它们全部添加。
根据评论,这是相同的图表,但使用您的实际问题。你唯一要做的就是弄清楚在函数内部要做什么。
我知道这可能令人沮丧,但是一旦掌握了它,你会发现它实际上非常简单。