2017-09-22 3 views
2

Je voudrais intégrer peut-être [int] dans ce.Chaîne à la liste des Int

Le code doit prendre une corde et filtrer les espaces transformant en une liste d'entiers et si leurs lettres sont rien renvoyer.

text2digits :: String -> [Int] 
text2digits s = case s of 
    []   -> [] 
    x:xs   
     |isDigit x  -> digitToInt x :text2digits (filter (/= ' ') xs) 
     |otherwise  -> undefined 

input "1233 5687" output: [1,2,3,3,5,6,8,7] 
input "a89"  required output : Nothing 
        current output: undefined 

J'ai essayé mais il montre une liste d'erreurs

text2digits :: String -> Maybe [Int] 
text2digits s = case s of 
    []   -> Just [] 
     x:xs   
     |isDigit x  -> Just digitToInt x :text2digits (filter (/= ' ') xs) 
     |otherwise  -> Nothing 
+0

Indiquez quel est le problème avec votre code actuel. Fournir un exemple d'entrée et de sortie attendue. –

+0

Dans votre cas 'autrement', renvoyez' Nothing'. Cela vous demandera cependant de changer le type de retour du cas 'isDigit', et le cas' [] ',' 'Maybe [Int]' aussi. Vous pouvez le faire en utilisant 'Just'. –

+0

Vous ne pouvez pas fusionner un 'Nothing' avec une liste ... –

Répondre

5

Quel est le problème avec le code, que vous avez spécifié pour text2digits :: String -> Maybe [Int]?

Le problème est dans cette ligne:

digitToInt x :text2digits (filter (/= ' ') xs) 

text2digits retours valeur de type Maybe [Int], mais (:) s'y attend d'être [Int].

Pour le fixer, vous pouvez utiliser fmap ou <$> pour appliquer une fonction à une structure à l'intérieur du foncteur Maybe:

import Data.Char 

text2digits :: String -> Maybe [Int] 
text2digits s = case s of 
    [] -> Just [] 
    x:xs 
     |isDigit x  -> ((digitToInt x) :) <$> text2digits (filter (/= ' ') xs) 
     |otherwise  -> Nothing 

main = print $ text2digits "1233 5687" 

Ou probablement vous pouvez utiliser traverse pour factoriser la fonction un peu:

import Data.Char 

text2digits :: String -> Maybe [Int] 
text2digits s = 
    traverse digitToMaybeInt $ filter (/= ' ') s 
    where 
    digitToMaybeInt x 
     | isDigit x = Just $ digitToInt x 
     | otherwise = Nothing 

main = print $ text2digits "89"