Abs*_*act 3 haskell pretty-print
我有一个号码9877342931235.使用Haskell,我需要将其显示为:
987-734293-123-5
我试过穿插列表,但当然在每个数字之间加上' - '.我该怎么做才能得出实际结果呢?
这是一个简单的通用解决方案,用于将列表拆分为指定长度的部分,然后将它们与指定的分隔符连接在一起:
splitercalate :: [Int] -> [a] -> [a] -> [a]
splitercalate (x:[]) _ s = take x s
splitercalate (x:xs) delim s =
case splitAt x s of
(a, []) -> a
(a, bs) -> a ++ delim ++ splitercalate xs delim bs
Run Code Online (Sandbox Code Playgroud)
在你的情况下splitercalate [3, 6, 3, 1] "-" $ show 9877342931235会给你你想要的.
更新:由于安塔尔SZ在下面评论所指出的,你可以通过使用功能更简洁实现这个功能Data.List和Data.List.Split:
splitercalate chunks sep = intercalate sep . splitPlaces chunks
Run Code Online (Sandbox Code Playgroud)
你需要安装split包(可能通过做类似的事情cabal install split),并导入intercalate和splitPlaces函数:
import Data.List (intercalate)
import Data.List.Split (splitPlaces)
Run Code Online (Sandbox Code Playgroud)
这两个版本应该是等价的.如果你不介意额外的imports和对split包装的依赖,使用Antal S-Z-它更好.