2010-01-14 5 views

Répondre

22
import Data.Char 

map digitToInt $ show 245 
+0

bel exemple ..! – jspcal

+0

donc je ceinture digitToInt sur une commande de spectacle d'un nombre? – RCIX

+0

Oui, si vous voulez utiliser cette approche ... Veillez seulement à transmettre des nombres non négatifs. Sinon, vous passeriez un '' -'' à 'digitToInt', ce qui est une erreur. Incidemment, la réponse cool de John Boker a un problème plus funky avec des nombres négatifs ... vérifier. :-) –

4

l'exemple ici fonctionnerait-il pour vous? http://snippets.dzone.com/posts/show/5961

convRadix :: (Integral b) => b -> b -> [b] 
convRadix n = unfoldr (\b -> if b == 0 then Nothing else Just (b `mod` n, b `div` n)) 

exemple:

> convRadix 10 1234 
[4, 3, 2, 1] 
> convRadix 10 0 
[] 
> convRadix 10 (-1) 
[9,9,...] (infinite) 

to convert haskell radix by mokehehe on Thu Aug 21 08:11:39 -0400 2008 
+0

Je l'écrirais plus comme 'convRadix b = unfoldr mModDiv où mModDiv 0 = mzero; mModDiv n = let (q, r) = n \ 'divMod \' b en retour (r, q) '(scindé en plusieurs lignes, ce que je ne peux pas faire dans un commentaire) mais c'est vraiment tout pareil :) – ephemient

1
digits :: (Integral a) => a -> [a] 
digits = flip digits' [] . abs 

digits' :: (Integral a) => a -> ([a] -> [a]) 
digits' n = if q == 0 
    then (r :) 
    else (digits q ++) . (r :) 
    where 
    (q, r) = n `divMod` 10 

digits 1234 == [1, 2, 3, 4] 
digits (-1234) == [1, 2, 3, 4] 
+0

Ou 'digits = fst. tête. filtre ((==) 0. snd). queue . itérez (\ (d, n) -> let (q, r) = n \ 'divMod \' 10 dans (r: d, q)). (,) []. abs' ;-) – ephemient

2
digits :: Int -> [Int] 
digits 0 = [] 
digits n = digits k ++ [r] 
    where k = div n 10; r = mod n 10 
+0

S'il vous plaît modifier votre réponse et mettre quatre espaces au début de chaque ligne, de sorte qu'il sera formaté en code. – Yitz

1
digits = reverse . map (`mod` 10) . takeWhile (> 0) . iterate (`div` 10) . abs 
Questions connexes