2016-04-15 5 views
0

Je travaille sur un projet dans Haskell pour la première fois et je travaille sur la traduction de mon ADT dans le code correctement, mais quand je suis en train d'écrire les définitions de type explicites pour mes fonctions et je charge mon code GHCi j'obtiens l'erreur suivante:erreur d'analyse sur l'entrée '::' lors d'une définition de type explicite pour une fonction qui accepte plusieurs arguments

Blockquote parse error on input ‘::’

la ligne en question est une fonction type appelé qui accepte un caractère et un tuple et renvoie un tuple comme indiqué ci-dessous:

type :: validChars -> tuple -> tuple 

validChars est la liste des caractères valides, les définitions de mes listes sont présentées ici si cela aide:

tuple = (l, r, b, k) 
l = [l | l <- validChars] 
m = [m | m <- validChars] 
b = [b | b <- validChars] 
k = [k | k <- validChars] 
validChars = [ chr c | c <-alphanumericChars , c >= 32, c <= 122] 
alphanumericChars = [ a | a <- [0..255]] 

J'ai vérifié pour vous assurer qu'il n'a pas été validChars provoquant l'erreur en le remplaçant par le type Chars comme ILLUSTRÉS

type :: Chars -> tuple -> tuple 

mais je reçois toujours la même erreur, je suis un débutant complet à Haskell donc je manque probablement quelque chose d'important, mais je ne suis pas sûr de ce que serait exactement; J'ai regardé des réponses à des questions similaires que j'ai échoué jusqu'ici. Toute aide avec ceci serait appréciée.

+2

'type' est [un mot-clé] (https://wiki.haskell.org/Keywords#type). Vos types doivent également commencer par [Capital Letters] (https://en.wikibooks.org/wiki/Haskell/Type_declarations) – HostileFork

+0

Je me sens si stupide de ne pas vérifier cela, merci beaucoup! :) –

Répondre

3

type est un mot-clé dans Haskell, donc vous ne pouvez pas l'utiliser comme nom de votre fonction.

En outre, les noms de type commencent par une lettre majuscule dans Haskell et tout ce qui commence par une lettre minuscule dans un type est une variable de type. Donc, si vous définissez myFunction :: validChars -> tuple -> tuple, cela définit une fonction qui prend deux arguments de types arbitraires et produit un résultat du même type que le second argument. C'est la même chose que myFunction :: a -> b -> b.

Si vous écrivez myFunction :: Chars -> tuple -> tuple, vous obtenez une fonction dont le premier argument doit être de type Chars (qui doit exister) et le second argument est d'un type arbitraire qui est aussi le type du résultat. Encore une fois, c'est la même chose que myFunction :: Chars -> a -> a. Notez que pour que cela fonctionne, vous devez avoir défini un type appelé Chars quelque part. Si vous souhaitez prendre une liste de Char s, le type doit être [Char] à la place.

Et si vous voulez que le deuxième argument et le résultat d'être en fait tuples (plutôt que juste une tuple variable de type arbitraire du nom), vous devez spécifier un type de tuple comme (a,b,c,d), qui accepterait arbitraires 4 triplets, ou quelque chose de spécifique comme (Integer, String, String, String), qui accepterait 4-tuples contenant un Integer et trois String s.

+0

Merci beaucoup! ce commentaire est vraiment utile, j'aurais dû vérifier les mots clés avant de commencer, ah ben plus tu en sais! –