Carte de fonction en Haskell
Autant je comprends la carte en Haskell prend une fonction et une Liste et applique cette fonction à chaque élément de cette liste avant de créer une nouvelle liste avec la fonction appliquée à chaque membre.
De l'essayer, cela fonctionne très bien avec les fonctions simples comme la (+5)
de sorte qu'il fonctionne bien si je type:
map (+7) [2,8,9,3]
J'obtiens:
[9,15,16,10]
Toutefois, cela ne fonctionne pas avec les fonctions que j'ai créé. Dire que j'ai fait une fonction shiftLetter
dont la déclaration de type est:
shiftLetter :: Char -> Int -> Char
(Int changer la façon dont loin le long de la lettre retournée est)
Si je fais une nouvelle fonction pour le faire avec plus d'une lettre et type:
shiftLetters :: String -> Int -> Char
shiftLetters letters shift = map shiftLetters "AKHLKHN"
J'ai des erreurs, pourquoi est-ce?
shiftLetters
et shiftAlphabet
, de les vérifier de nouveauQu'est-ce que
shiftAlphabet
? Quelque chose comme shiftAlphabet char = shiftLetter char shift
peut-être ce que vous cherchez?dans l'interpréteur, faire ces choses et figure sur votre propre:
:t map
, :t shiftLetter
.et aussi
:t map shiftLetter "AKHLKHN"
, je veux dire."J'ai des erreurs, pourquoi est-ce?" parce qu'il y a erreurs. Et croyez-le ou pas, le texte des messages d'erreur est une cause de préoccupation, oui, en effet. Si vous ne lisez pas, vous devriez au moins de les poster.
OriginalL'auteur Eddie | 2013-10-12
Vous devez vous connecter pour publier un commentaire.
Si vous cochez le type de la
map
fonction, alors vous voyez:De sorte que vous besoin d'une fonction qui prend un paramètre, mais le vôtre prend deux. Vous devez utiliser
ou
Inutile de style:
ou vous pouvez faire
(`shiftLetter` shift)
au lieu de(flip shiftLetter $ shift)
Le type de système ne vous empêche pas de mappage des fonctions de plusieurs variables. (En fait, dans le "applicative" de style, il est très courant.)
map shiftLetters
est parfaitement valide expression, avec un type deString -> [(Int -> Char)]
.Essayé ce que j'obtiens: erreur de Syntaxe sur " shiftLetter peut-être que vous l'intention d'utiliser -XTemplateHaskell
L'espace après
$
est important.OriginalL'auteur Hauleth
Il semble que vous souhaitez
shiftLetter prend un Char, pas une Chaîne de caractères. Notez que la Chaîne est la même que [Char], qui est différente de Char.
Je sais! Désolé, les fonctions sont très similaires noms. shiftLetter prend un Char, mais shiftLetters prend une Chaîne de caractères?
OriginalL'auteur Louis Wasserman