3

我有一个号码 9877342931235。使用 Haskell,我需要将其显示为:

987-734293-123-5

我试过穿插列表,但当然会在每个数字之间加上“-”。我将如何做才能产生实际结果?

4

2 回答 2

6

这是一个简单的通用解决方案,用于将列表拆分为指定长度的部分,然后使用指定的分隔符将它们连接在一起:

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),并导入intercalatesplitPlaces功能:

import Data.List (intercalate)
import Data.List.Split (splitPlaces)

这两个版本应该是等价的。如果您不介意额外import的 s 和对包的依赖split,请使用 Antal SZ——它会好得多。

于 2010-05-31T04:20:51.063 回答
0

好的,如果您不想使用 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

于 2010-05-31T09:20:49.480 回答