2010-05-31 86 views
3

我公司拥有一批9877342931235.使用哈斯克尔,我需要将其显示为:哈斯克尔 - 解释了一些

987-734293-123-5

我试过点缀列表中,但当然是在每个数字之间放置' - '。我怎么做才能得到实际的结果?

+0

你会怎么做,在任何其他的语言吗?转换为字符串,将数字组正则表达,并连接 - ?那么,就在Haskell那里做吧。 – jrockway 2010-05-31 02:59:08

回答

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会给你想要的东西。

UPDATE:

splitercalate chunks sep = intercalate sep . splitPlaces chunks 

您需要安装split包(可能是这样做的:作为Antal S-Z笔记在下面留言,您可以通过使用功能从Data.ListData.List.Split更简洁实现这个功能像cabal install split),并导入intercalatesplitPlaces功能:

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

这两个版本应该是等效的。如果您不介意额外的import和对split程序包的依赖,请使用Antal S-Z,它更好。

+3

你的'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上看到的答案来看,分割包真的没有用 - 这太糟糕了,因为包非常好。 – 2010-05-31 05:42:11

+0

多数民众赞成真棒,非常感谢的人 – Abstract 2010-05-31 06:06:54

+0

Wats这个东西从data.list包虽然? – Abstract 2010-05-31 06:07:26

0

OK,如果你不希望使用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