这段代码对我来说似乎有点迟钝......有人想通过解释来帮助我吗?
uniq_c l = [ nl (tam l) i s | (s,i) <- uniq_c' l]
tam = maximum . map snd . uniq_c'
uniq_c' [] = []
uniq_c' (h:t) = let (list,rest) = span (==h) t
n = length list + 1
in (h,n) : uniq_c' rest
nl tam n line = let l = length $ show n
l_tam = length $ show tam
n' = replicate (l_tam-l) " "
in concat n' ++ show n ++ " " ++ line
Run Code Online (Sandbox Code Playgroud)
那段代码不是很好.它不会重用任何现有的Haskell库.这是另一种选择.这个group功能完成了工作; 认识到重复发生.在该length &&& head采取每个这样的子表,使计数和单词.最后uniq_c找到最大宽度并用于printf格式化输出.
import Control.Arrow
import Data.List
import Text.Printf
uniq :: (Eq a) => [a] -> [(Int, a)]
uniq = map (length &&& head) . group
uniq_c :: [String] -> [String]
uniq_c l =
let us = uniq l
width = length . show . maximum . map fst $ us
in map (uncurry $ printf "%*d %s" width) us
Run Code Online (Sandbox Code Playgroud)