Voici une solution simple et générale pour diviser une liste en parties de longueurs spécifiées, puis de les assembler avec un delimiter spécifié:
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
Dans votre cas splitercalate [3, 6, 3, 1] "-" $ show 9877342931235
vous donnera ce que vous voulez.
MISE À JOUR: Comme Antal S-Z notes dans un commentaire ci-dessous, vous pouvez implémenter cette fonction de façon plus concise en utilisant des fonctions de Data.List
et Data.List.Split
:
splitercalate chunks sep = intercalate sep . splitPlaces chunks
Vous devez installer le paquet split
(probablement en faisant quelque chose comme cabal install split
), et importer les fonctions intercalate
et splitPlaces
:
import Data.List (intercalate)
import Data.List.Split (splitPlaces)
Les deux versions doivent être équivalentes. Si cela ne vous dérange pas le supplément import
s et la dépendance sur le paquet split
, utilisez Antal S-Z's-c'est beaucoup plus agréable.
Comment feriez-vous dans une autre langue? Convertir en chaîne, regex les groupes de chiffres, concaténer avec -? Eh bien, fais ça ŕ Haskell. – jrockway