通过计算重复元素进行压缩(Haskell)

1 compression haskell run-length-encoding

我正在寻找标准高阶函数的直接组合,通过计算重复元素来压缩列表.例如,结果为

"abbccccb"

将会 :

 [(1, 'a'), (2, 'b'), (4, 'c'), (1, 'b')] 
Run Code Online (Sandbox Code Playgroud)

另一个例子,结果为

(sort "abrakadabra") 
Run Code Online (Sandbox Code Playgroud)

将会:

[(5, 'a'), (2, 'b'), (1, 'd'), (1, 'k'), (2, 'r')]
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 10

从使用开始Data.List.group.这为您提供了相同元素的运行列表,例如

> group "abbccccb"
["a","bb","cccc","b"]
Run Code Online (Sandbox Code Playgroud)

然后,map在这个列表中,走的是headlength每个运行.这可以用优雅的完成&&&操作者Control.Arrow:

> map (length &&& head) . group $ "abbccccb"
[(1,'a'),(2,'b'),(4,'c'),(1,'b')]
Run Code Online (Sandbox Code Playgroud)

  • 以上的更长描述是Real World Haskell的Run Length Encoding部分:http://book.realworldhaskell.org/read/barcode-recognition.html#id631625 (3认同)