给定一个字符串,获取元组列表(char,字符连续出现多少次)- Haskell
Given a string, get list of tuples (char, how many times the character goes in a row) - Haskell
例如:ʺaaaabbaabʺ->[(‘a’,4),(‘b’,2),(‘a’,2),(‘b’,1)]
它需要通过列表的一次传递使用 FOLDR 来完成,而不是使用 (++)。
这是我目前所掌握的
task2 (x:xs) = foldr (\c [(symbol, count)] -> if symbol == c then [(symbol, count+1)] else [(symbol, count)]) [(x, 1)] xs
问题是我真的不明白如何让它在 'if' 语句为 False
后转到列表的下一个元素
将 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 ...
如果 (c == c1) 那么 (c1,1+n1) : ps
否则 (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 ""
[]
λ>
例如:ʺaaaabbaabʺ->[(‘a’,4),(‘b’,2),(‘a’,2),(‘b’,1)] 它需要通过列表的一次传递使用 FOLDR 来完成,而不是使用 (++)。
这是我目前所掌握的
task2 (x:xs) = foldr (\c [(symbol, count)] -> if symbol == c then [(symbol, count+1)] else [(symbol, count)]) [(x, 1)] xs
问题是我真的不明白如何让它在 'if' 语句为 False
后转到列表的下一个元素将 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 ...
如果 (c == c1) 那么 (c1,1+n1) : ps 否则 (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 ""
[]
λ>