2010-05-31 9 views
3

J'ai un numéro 9877342931235. En utilisant Haskell, je dois montrer que:Haskell - interpréter un certain nombre

987-734293-123-5

J'ai essayé intercalant la liste mais bien sûr que met '-' entre chaque chiffre. Comment ferais-je pour obtenir le résultat réel?

+0

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

Répondre

6

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.

+3

Votre fonction 'splitercalate' est équivalente à' splitercalate chunks sep = intercalate sep. splitplaces morceaux »; 'intercalate' vient de' Data.List', et 'splitPlaces' vient de [' Data.List.Split'] (http://hackage.haskell.org/package/split-0.1.2). A en juger par les réponses que j'ai vues sur StackOverflow, le paquetage divisé est vraiment sous-utilisé - c'est dommage, parce que le paquet est vraiment sympa. –

+0

c'est génial, merci beaucoup à l'homme – Abstract

+0

wats ce truc du paquet data.list cependant? – Abstract

0

OK, si vous ne voulez pas utiliser 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

Votre réponse est alors concat . splitercalate [3,5,3,1] "-" $ show 9877342931235