2016-11-22 6 views
0

Nouveau à Haskell:Haskell | Problèmes avec les chars tournants et Int à la ficelle.

Salut ne semble pas comprendre cela.

Ce que je suis en train de faire est de prendre une chaîne, mettez-le dans un [Int] (avec carte ord)

Modifier quelques chiffres qui REMPLIT quelque chose (dans ce cas x mod 3 == 0). Par la suite je voudrais retourner les nombres inchangés à char, et a changé les numéros de nombres fixes. Combinez cela dans une chaîne à nouveau ..

Ceci est mon problème:

*Main> fromStringToList "hihello" 
[104,105,104,101,108,108,111] 
*Main> changeB3 [104,105,104,101,108,108,111] 
"'h'210'h''e'216216222" 

Ce que je veux:

"h210he216216222" 

Je suis coincé à trouver comment utiliser la carte et spectacle pour obtenir ceci pour travailler sans le '_' de Char. Merci.

Mon code:

import Data.Char 

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

{- 
    changeB3 
    PRE: True 
    POST: every Int that can be divided by 3 is multiplied by 2 and 
kept as int, otherwise transformed to char 

-} 
changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

Répondre

2

Je commenterai votre code.

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

La deuxième ligne est redondante: quand myString est vide, map retours [] de toute façon. Vous devriez l'enlever.

changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

Vous semblez être confus ici. Vous utilisez une fonction récursive, mais souhaitez utiliser map. Vous utilisez soit récursion ou map ici, pas les deux. En supposant que vous souhaitez utiliser map, vous devez commencer par définir comment gérer un seul Int.

changeB3Single :: Int -> String 
changeB3Single x | x `mod` 3 == 0 = ... 
       | otherwise  = ... 

Puis vous map que sur l'ensemble de la liste. Une première tentative pourrait être

changeB3 :: [Int] -> String 
changeB3 xs = map changeB3Single xs -- type error! 

mais cela ne fonctionnera pas, car map renvoie ici une liste de chaînes, au lieu d'une seule chaîne. Nous avons juste besoin de les concaténer.

changeB3 xs = concat (map changeB3Single xs) 

En effet, concat (map ...) est si souvent constaté qu'il a sa propre fonction dans les bibliothèques:

changeB3 xs = concatMap changeB3Single xs 

(On pourrait faire ce Pointfree, mais il n'y a pas besoin de - surtout pour un débutant.)

+0

Merci beaucoup! Yep .. A été confondu avec la carte et la récursion essayé de les combiner à partir de deux fonctions précédentes. Atteint pour quelque chose qui ne comprend pas complètement les principes derrière les deux ... Un grand merci! Très bien expliqué! –