List 如何计算OCaml中任何元素类型的列表中连续出现的次数?
在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
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)
这是要折叠列表的基本操作,而不是示例代码的+
操作