Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell uniq-c仿真器代码解释_Haskell - Fatal编程技术网

Haskell uniq-c仿真器代码解释

Haskell uniq-c仿真器代码解释,haskell,Haskell,这个代码对我来说似乎有点迟钝。。。有人愿意帮我解释一下吗 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) : un

这个代码对我来说似乎有点迟钝。。。有人愿意帮我解释一下吗

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

uniq_c l=[nl(tam l)i s|(s,i)
uniq_c
提供字符串在字符串列表中出现的次数计数,该字符串与特定字符串的空格相连:

*A> uniq_c ["The","quick","brown","fox","fox"]
["1 The","1 quick","1 brown","2 fox"]

*A> uniq_c $ ["The","quick","brown","fox","fox","fox"] ++ (replicate 100 "fox")
["  1 The","  1 quick","  1 brown","103 fox"]
uniq\u c'
提供了
(字符串,计数)
的元组列表

tam
查找最大计数(这将是任何特定字符串的最后一次出现)

nl
缩进计数,使计数正确对齐

*A> mapM_ putStrLn $ uniq_c $ ["The","quick","brown","fox","fox","fox"] ++ (replicate 100 "fox")
  1 The
  1 quick
  1 brown
103 fox

这段代码不是很好,它没有重用任何现有的Haskell库。 这里是另一种选择。
group
函数完成了大量工作;识别重复出现的情况。
length&&head
获取每个这样的子列表并进行计数和单词。最后
uniq\u 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

那个代码很糟糕,尽量避免养成任何习惯。我觉得它看起来有点可疑。想解释一下原因吗?我会用更好的代码回复。注意这是游程编码:
uniq_c[“a”,“b”,“a”]==[“1a”,“1b”,“1a”]