繁体   English   中英

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

[英]How to count the number of consecutive occurrences in a list of any element type in OCaml?

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

let ls : string list = ["A"; "A"; "B"; "B"; "A"; "Y"; "Y"; "Y"] ;;

我在编写 function 时遇到问题,它计算一个元素连续出现的次数,并将该元素与其频率配对。 例如,将上面的列表作为输入,function 应该返回[("A", 2); ("B", 2), ("A", 1), ("Y", 3)] [("A", 2); ("B", 2), ("A", 1), ("Y", 3)]

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

我的直觉是以如下类似的方式使用类似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)

这实质上是从左到右对所有元素进行累加。 但是,就我而言,我不想累加所有元素,我只需要计算一个元素连续出现的次数。 一些建议将不胜感激!

这显然是一项家庭作业,所以我只会给出一些提示。

当您的代码运行时,它不会将字符串(或任何其他类型)添加在一起。 它将把整数加在一起。 所以你可能想再次回顾一下 .net 上的那些例子:-)

您绝对可以使用fold_left来获得答案。 首先,请注意结果是一个对列表。 每对的第一个元素可以是任何类型,具体取决于原始列表的类型。 每对中的第二个元素是一个整数。 所以你有一个你正在使用的基本类型: ('a * int) list

想象一下,您有一种方法可以“增加”这样的列表:

let increment (list: ('a * int) list) value =
     (* This is one way to think of your problem *)

这个 function 在列表中查找第一个元素等于 value 的对。 如果找到它,它会返回一个新列表,其中关联的 int 比以前大一个。 如果找不到它,它会返回一个带有额外元素(value, 1)的新列表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM