List 如何计算OCaml中任何元素类型的列表中连续出现的次数?

List 如何计算OCaml中任何元素类型的列表中连续出现的次数?,list,ocaml,List,Ocaml,在OCaml中,假设我有一个字符串列表,如下所示: let ls : string list = ["A"; "A"; "B"; "B"; "A"; "Y"; "Y"; "Y"] ;; 我很难编写一个函数来计算一个元素连续出现的次数,并将该元素与其频率配对。例如,给定上述列表作为输入,函数应该返回[(“A”,2);(“B”,2),(“A

在OCaml中,假设我有一个字符串列表,如下所示:

let ls : string list = ["A"; "A"; "B"; "B"; "A"; "Y"; "Y"; "Y"] ;;
我很难编写一个函数来计算一个元素连续出现的次数,并将该元素与其频率配对。例如,给定上述列表作为输入,函数应该返回
[(“A”,2);(“B”,2),(“A”,1),(“Y”,3)]

我试着在其他地方寻找一些提示,但几乎所有其他类似的操作都是使用
int list
s完成的,在这里,简单地将数字相加很容易。但是在这里,我们不能添加字符串

我的直觉是以类似的方式使用
fold_left
,如下所示:

let lis : int list = [1;2;3;4;5]
let count (lis : int list) = List.fold_left (fun x y -> x + y) (0) (lis)

基本上是从左到右累加所有元素。但是,在我的例子中,我不想累加所有元素,我只需要计算一个元素连续出现的次数。一些建议将不胜感激

这显然是一个家庭作业,所以我只给你几个提示

当代码正常工作时,它不会同时添加字符串(或任何其他类型)。它将把整数加在一起。因此,您可能想再次回顾一下网络上的这些示例:-)

您完全可以使用
左折
获得答案。首先,请注意resultl是一个成对的列表。每对的第一个元素可以是任何类型,具体取决于原始列表的类型。每对中的第二个元素是int。因此,您有一个正在使用的基本类型:
('a*int)list

假设您有一种方法“增加”这样一个列表:

let increment (list: ('a * int) list) value =
     (* This is one way to think of your problem *)
此函数在列表中查找第一个元素等于value的对。如果找到它,它将返回一个新列表,其中关联的int比以前大一个。如果找不到,它将返回一个新列表,其中包含一个额外的元素
(值,1)

这是要折叠列表的基本操作,而不是示例代码的
+
操作