Haskell - 解释一个数字

Abs*_*act 3 haskell pretty-print

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

987-734293-123-5

我试过穿插列表,但当然在每个数字之间加上' - '.我该怎么做才能得出实际结果呢?

Tra*_*own 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
Run Code Online (Sandbox Code Playgroud)

在你的情况下splitercalate [3, 6, 3, 1] "-" $ show 9877342931235会给你你想要的.

更新:由于安塔尔SZ在下面评论所指出的,你可以通过使用功能更简洁实现这个功能Data.ListData.List.Split:

splitercalate chunks sep = intercalate sep . splitPlaces chunks
Run Code Online (Sandbox Code Playgroud)

你需要安装split包(可能通过做类似的事情cabal install split),并导入intercalatesplitPlaces函数:

import Data.List (intercalate)
import Data.List.Split (splitPlaces)
Run Code Online (Sandbox Code Playgroud)

这两个版本应该是等价的.如果你不介意额外的imports和对split包装的依赖,使用Antal S-Z-它更好.

  • 你的`splitercalate`函数相当于`splitercalate chunks sep = intercalate sep.splitPlaces chunks`; `intercalate`来自`Data.List`,`splitPlaces`来自[`Data.List.Split`](http://hackage.haskell.org/package/split-0.1.2).从我在StackOverflow上看到的答案来看,拆分包真的未得到充分利用 - 这太糟糕了,因为包非常好. (3认同)