如何在SML/NJ中编写一个函数,在给定的列表中,对连续相等的元素进行计数,并返回成对的列表(值、计数)?

如何在SML/NJ中编写一个函数,在给定的列表中,对连续相等的元素进行计数,并返回成对的列表(值、计数)?,sml,smlnj,Sml,Smlnj,我必须用SML/NJ编写一个函数,在给定的列表中,对连续相等的元素进行计数,并返回一个对列表(值,计数)。函数应如下所示: fun group (xs: ''a list): (''a * int) list 我只能使用匿名函数和结构列表、列表对和数学 我不知道怎么做。有人能帮我吗?一种简单但低效的方法是写: 并将输出进一步转化为: val group_count : ''a list -> (''a * int) list 以以下方式: fun group_count xss = m

我必须用SML/NJ编写一个函数,在给定的列表中,对连续相等的元素进行计数,并返回一个对列表(值,计数)。函数应如下所示:

fun group (xs: ''a list): (''a * int) list
我只能使用匿名函数和结构列表、列表对和数学


我不知道怎么做。有人能帮我吗?

一种简单但低效的方法是写:

并将输出进一步转化为:

val group_count : ''a list -> (''a * int) list
以以下方式:

fun group_count xss = map (fn xs => (hd xs, length xs)) xss
但更有效的方法是编写函数
span\u count

fun span_count p x [] count = (count, [])
  | span_count p x (y::xs) count =
    if p (x, y)
    then span_count p x xs (count+1)
    else (count, y::xs)
并递归地使用它:

fun group_count [] = []
  | group_count (x::xs) =
    case span_count op= x xs 1 of
      (count, ys) => (x, count) :: group_count ys
fun group_count [] = []
  | group_count (x::xs) =
    case span_count op= x xs 1 of
      (count, ys) => (x, count) :: group_count ys