使用fold来汇总列表OCAML中字符的所有ASCII值

时间:2018-02-07 05:25:50

标签: ocaml

我正在尝试实现“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中有什么(有趣......),所以你的任何输入对我都有帮助。

谢谢!

2 个答案:

答案 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]中的元素相加,但实际上它是如何实现的:

Fold example diagram

(我希望这个图表有道理,我把它从头脑中拉出来。)

您需要弄清楚的是实际的函数将返回正确的中间结果。

  

快速提示:请注意您的类型。在我的示例中,结果与列表中的元素具有相同的类型,而不是您的情况。

     

快速提示2 :另一种方法是使用List.map计算角色的所有ASCII值,然后将它们全部添加。

根据评论,这是相同的图表,但使用您的实际问题。你唯一要做的就是弄清楚在函数内部要做什么。

我知道这可能令人沮丧,但是一旦掌握了它,你会发现它实际上非常简单。

Fold example updated diagram