2010-12-03 14 views
0

J'ai posté une question aujourd'hui et quelqu'un a aidé mais son code ne fonctionne pas. Ceci est le lien au poste link to the postBesoin d'aide pour corriger un petit bug

Quand je lance son code, je reçois une erreur: "parse error sur l'entrée` '"

Le". " après que "\ t" provoque l'erreur. Suis nouveau dans Haskell donc je ne sais pas pourquoi il cause l'erreur.

Besoin d'aide pour résoudre ce problème.

grâce

MISE À JOUR

je reçois erreur lorsque je charge le code. c'est l'erreur:

Couldn't match expected type `a -> Bool' 
      against inferred type `[Bool]' 
    In the first argument of `any', namely 
     `(map (\ t -> contains t b) c)' 
    In the second argument of `(||)', namely 
     `any (map (\ t -> contains t b) c)' 
    In the expression: a == b || any (map (\ t -> contains t b) c) 

besoin d'aide pour le réparer.

grâce

MISE À JOUR

quand je lance le code après les modifications:

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show) 

contains :: Tree a -> a -> Bool 
contains (Leaf a) b = a == b 
contains (Branch a c) b = a == b or (map (\ t -> contains t b) c) 

c'est l'erreur que je reçois maintenant:

Occurs check: cannot construct the infinite type: 
     a = ([Bool] -> Bool) -> [Bool] -> a 
    When generalising the type(s) for `contains' 

MISE À JOUR 3

S'il vous plaît c'est mon code et pourtant je reçois encore une erreur après avoir fait tous les changements. Je ne comprends pas:

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show) 

contains :: Eq a => Tree a -> a -> Bool 
contains (Leaf a) b = a == b 
contains (Branch a c) b = a == b || (map (\t -> contains t b) c) 

Le booléen ne fonctionne pas sur mon système, donc je dois utiliser Bool. Maintenant, c'est l'erreur que je reçois:

Couldn't match expected type `Bool' against inferred type `[Bool]' 
    In the second argument of `(||)', namely 
     `(map (\ t -> contains t b) c)' 
    In the expression: a == b || (map (\ t -> contains t b) c) 
    In the definition of `contains': 
     contains (Branch a c) b = a == b || (map (\ t -> contains t b) c) 

Veuillez exécuter le code ci-dessus si cela fonctionne. Ou peut-être qu'il me manque quelque chose quelque part. Je tiens à vous remercier pour votre temps. Je vous en suis reconnaissant.

grâce

+0

C'était une faute de frappe, methinks ('\ t. (...)' n'est pas valide Haskell, '\ t -> (...)' est - remplacer l'ellipse avec quelque chose de valide, de bien sûr) et il l'a déjà réparé. – delnan

Répondre

2

La syntaxe à la liste séparée des arguments d'un lambda de son corps dans Haskell est ->, pas . comme dans le calcul lambda. Btw: cela a déjà été corrigé dans le post auquel vous avez lié. Edit: Il a également obtenu l'utilisation de any mauvais - il le traite comme s'il s'agissait de or. Il doit être soit

or (map (\ t -> contains t b) c) 

ou

any (\t -> contains t b) c 

En plus de cela la signature de type est faux (Boolean au lieu de Bool et manquant Eq contrainte).Donc, soit le supprimer ou le modifier à:

contains :: Eq a => Tree a -> a -> Bool 
+0

Merci pour votre réponse. J'ai aussi réparé mais je reçois une nouvelle erreur quand je cours le code. J'ai inclus cette nouvelle erreur dans mon message ci-dessus. Cela a à voir avec les types. Besoin d'aide pour le réparer. – kap

+0

J'ai encore mis à jour le poste pour une autre erreur que je reçois après avoir fait les changements – kap

+0

@kap: Oui, le type sig était faux aussi bien. Cette fois j'ai essayé de le compiler et ça marche maintenant. – sepp2k