2010-05-31 80 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