如何从列表末尾开始的列表中读取3个元素的块?

Cla*_*nka 2 haskell

这是我的功能签名:

foo :: Integer -> [String]
Run Code Online (Sandbox Code Playgroud)

该功能应如何工作:

  1. foo 1234567 应该回来 ["567", "234", "001"]
  2. foo 12345678 应该回来 ["678", "345", "012"]
  3. f oo 123456789应该返回["789", "456", "123"]

我目前的解决方案

zeichenreihenBlock :: Integer -> [String]
zeichenreihenBlock x = reverse (partition (show x))

partition :: String -> [String]
partition [] = []
partition x
    | length x `mod` 3 == 2 = take 3 ("0" ++ x) : partition (drop 3 ("0" ++ x))   
    | length x `mod` 3 == 1 = take 3 ("00" ++ x) : partition (drop 3 ("00" ++ x))   
    | length x `mod` 3 == 0 = take 3 x : partition (drop 3 x)
Run Code Online (Sandbox Code Playgroud)

用'foo'替换'zeichenreihenBlock'.你会如何实现这个?有更有效的解决方案吗?

真的很感激一些新想法.

干杯

luq*_*qui 6

使用数字来获取组更容易,而不是使用字符串.

digitGroups group 0 = []
digitGroups group n = r : digitGroups group q
    where (q,r) = n `divMod` (10^group)

-- > digitGroups 3 1234567
-- [567,234,1]
Run Code Online (Sandbox Code Playgroud)

然后使用填充显示成为一个单独的问题:

pad char len str = replicate (len - length str) char ++ str

-- > pad '0' 3 "12"
-- "012"
Run Code Online (Sandbox Code Playgroud)

他们聚在一起寻找最终解决方案:

foo = map (pad '0' 3 . show) . digitGroups 3

-- > foo 1234567
-- ["567","234","001"]
Run Code Online (Sandbox Code Playgroud)