这是我的功能签名:
foo :: Integer -> [String]
Run Code Online (Sandbox Code Playgroud)
该功能应如何工作:
foo 1234567 应该回来 ["567", "234", "001"]foo 12345678 应该回来 ["678", "345", "012"]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'.你会如何实现这个?有更有效的解决方案吗?
真的很感激一些新想法.
干杯
使用数字来获取组更容易,而不是使用字符串.
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)