Простой, но неэффективный способ - написать эту версию group
:
val group : ''a list -> ''a list list
и преобразовать вывод далее в:
val group_count : ''a list -> (''a * int) list
следующим образом:
fun group_count xss = map (fn xs => (hd xs, length xs)) xss
Но более эффективным способом было бы написать функцию span_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