我公司拥有一批9877342931235.使用哈斯克尔,我需要将其显示为:哈斯克尔 - 解释了一些
987-734293-123-5
我试过点缀列表中,但当然是在每个数字之间放置' - '。我怎么做才能得到实际的结果?
我公司拥有一批9877342931235.使用哈斯克尔,我需要将其显示为:哈斯克尔 - 解释了一些
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
会给你想要的东西。
UPDATE:
splitercalate chunks sep = intercalate sep . splitPlaces chunks
您需要安装split
包(可能是这样做的:作为Antal S-Z笔记在下面留言,您可以通过使用功能从Data.List
和Data.List.Split
更简洁实现这个功能像cabal install split
),并导入intercalate
和splitPlaces
功能:
import Data.List (intercalate)
import Data.List.Split (splitPlaces)
这两个版本应该是等效的。如果您不介意额外的import
和对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上看到的答案来看,分割包真的没有用 - 这太糟糕了,因为包非常好。 – 2010-05-31 05:42:11
多数民众赞成真棒,非常感谢的人 – Abstract 2010-05-31 06:06:54
Wats这个东西从data.list包虽然? – Abstract 2010-05-31 06:07:26
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
你会怎么做,在任何其他的语言吗?转换为字符串,将数字组正则表达,并连接 - ?那么,就在Haskell那里做吧。 – jrockway 2010-05-31 02:59:08