我有一个号码 9877342931235。使用 Haskell,我需要将其显示为:
987-734293-123-5
我试过穿插列表,但当然会在每个数字之间加上“-”。我将如何做才能产生实际结果?
我有一个号码 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
在你的情况下splitercalate [3, 6, 3, 1] "-" $ show 9877342931235
会给你你想要的。
更新:正如Antal SZData.List
在下面的评论中指出的那样,您可以通过使用来自和的函数更简洁地实现此功能Data.List.Split
:
splitercalate chunks sep = intercalate sep . splitPlaces chunks
您需要安装split
包(可能通过执行类似的操作cabal install split
),并导入intercalate
和splitPlaces
功能:
import Data.List (intercalate)
import Data.List.Split (splitPlaces)
这两个版本应该是等价的。如果您不介意额外import
的 s 和对包的依赖split
,请使用 Antal SZ——它会好得多。
好的,如果您不想使用 Data.List.Split...
import Data.List (intercalate)
splitPlaces (n:ns) x = let (h, t) = splitAt n x
in h : splitPlaces ns t
splitPlaces _ x = []
splitercalate chunks sep = intercalate sep . splitPlace chunks
那么你的答案是concat . splitercalate [3,5,3,1] "-" $ show 9877342931235