Il y a quelques petites choses qui ne fonctionnent pas vraiment avec le code que vous nous avez donné.
Je vais travailler à travers les erreurs de compilation.
Lors de la première charge, nous obtenons une erreur de nom:
ex1.hs:10:26:
Not in scope: 'color'
Perhaps you meant 'colors' (line 6)
(et encore à la ligne 11)
Bien sûr, le compilateur est correct et nous avons juste besoin de changer les noms appropriés pour correspondre.
Nous récupérons l'intéressant, je suppose que vous faites référence en ce qui concerne IO et les fonctions non-IO:
ex1.hs:28:7:
Couldn't match type '[]' with 'IO'
Expected type: IO Char
Actual type: String
In the return type of a call of 'game'
In a stmt of a 'do' block: game b
In the expression:
do { a <- getLine;
let b = map read $ words a;
game b;
start }
L'erreur est votre utilisation de game b
dans le bloc IO
.
L'annotation de type que vous avez commentée sur la définition de fonction de game
est en fait correcte - il s'agit de [Integer] -> [Char]
.
En tant que tel c'est une fonction pure et nous n'avons pas besoin d'utiliser la notation do
pour le décrire comme nous le ferions avec quelque chose qui traite de IO - parce que vous avez utilisé la notation ici avec un argument d'une liste, le do
expression représente un calcul dans le contexte d'une liste, pas un calcul d'E/S, donc l'appeler de start
a une incompatibilité de type, il attend IO
, mais il a trouvé []
.
Nous pouvons commencer à le réparer en transformant game
en une pure fonction, en utilisant une expression let-in
.
game :: [Integer] -> [Char]
game a = let black = test a colors
white = (test2 a colors) - black
x = [a] ++ createScore black white
in show x
Maintenant, nous avons une fonction qui retourne la chaîne de l'entrée et son score.
Le compilateur donne maintenant l'erreur Expected type: IO Char, Actual type: [Char]
, car nous essayons toujours d'utiliser une expression non-IO dans le bloc principal do
.
Nous pouvons régler en imprimant en fait la chaîne à stdout
, à l'aide d'impression, de sorte que votre original
--print b
game b
peut juste être
print $ game b
À ce stade, le programme compile!
Malheureusement, ce n'est pas tout à fait exact, lorsque nous exécutons cela et tapez une liste d'entiers comme 1 2 3
, nous obtenons l'exception ex1.hs:(14, 1)-(15,66): Non-exhaustive patterns in function test
.
Celui-ci se résume à votre définition de test
comme:
test [] [] = 0
test (x:xs) (y:ys)
Ne tient pas compte de la possibilité d'une liste soit vide - parce que le chèque est toujours entre les éléments de tête des listes probablement la le plus petit changement pour corriger cela pourrait être:
test (x:xs) (y:ys) = if x == y then 1+test xs ys else 0+test xs ys
test _ _ = 0
Et maintenant le programme compile et exécute. J'espère que cela a du sens.
Vous devez ajouter le message d'erreur. – Nicolas