首页 > 解决方案 > 给定一个字符串,获取元组列表(字符,字符连续出现多少次) - Haskell

问题描述

例如: ʺaaaabbaabʺ->[('a',4),('b',2),('a',2),('b',1)]列表,不使用 (++)。

这是我到目前为止所拥有的

task2 (x:xs) = foldr (\c [(symbol, count)] -> if symbol == c then [(symbol, count+1)] else [(symbol, count)]) [(x, 1)] xs

问题是我真的不明白如何让它在“if”语句为 False 之后转到列表的下一个元素

标签: listhaskellfold

解决方案


将 step 函数编写为内联 lambda 表达式可能不是最好的举措。它可以工作,但这会导致很长的代码行。

单独编写 step 函数更容易,如下所示:

task2 :: String -> [(Char,Int)]
task2 cs = foldr stepFn [] cs
  where
    stepFn c      []          =  [(c,1)]  -- simple case
    stepFn c ((c1,n1) : ps)   =           -- please try to write the rest ...

if (c == c1) then (c1,1+n1) : ps else (c,1) : (c1,n1) : ps

测试:

$ ghci
 GHCi, version 8.8.4: https://www.haskell.org/ghc/  :? for help
 λ> 
 λ> :load q69871708.hs
 [1 of 1] Compiling Main             ( q69871708.hs, interpreted )
 Ok, one module loaded.
 λ> 
 λ> task2 "aaaabbaabrrrzz"
 [('a',4),('b',2),('a',2),('b',1),('r',3),('z',2)]
 λ> 
 λ> task2 "a"
 [('a',1)]
 λ> 
 λ> task2 ""
 []
 λ> 

推荐阅读