3

Ceci est le code que j'ai:Haskell: où est le "parse error dans le modèle"

connected :: [(Integer,Integer)] -> Bool 
connected [] = True 
connected [(_,_)] = True 
connected (a,b):(c,d):xs 
       | a > c  = False 
       |otherwise = connected (c,d):xs 

Quand je le charge ghci il montre

error: parse error in pattern: connected

Où avez Je me trompe?

+0

Note de style mineur: 'foo | x = Faux | sinon = quelque chose est (IMO) plus communément écrit comme 'foo = not x && something'. Dans votre cas, vous pouvez utiliser 'connected (...) = a <= c && connected (...)'. – chi

Répondre

7

Vous devez ajouter des parenthèses autour de vos expressions cons en deux endroits:

connected :: [(Integer,Integer)] -> Bool 
connected [] = True 
connected [(_,_)] = True 
connected ((a,b):(c,d):xs)       -- (2) 
       | a > c  = False 
       | otherwise = connected ((c,d):xs) -- (1) 
  1. application Fonction lie plus étroitement que les opérateurs infixes, donc connected (c,d) : xs obtient analysé comme (connected (c,d)) : xs.

  2. Une chose similaire se produit dans l'expression de modèle. Bien que le message d'erreur inutile que vous obtenez là-bas est plutôt malheureux.

remarque Opinionated: Je vous conseille d'écrire toujours les opérateurs infixes avec des espaces autour d'eux (par exemple, a : b au lieu de a:b), parce que je pense en omettant les espaces blancs implique subtilement que l'opérateur se lie plus étroitement qu'il fait vraiment.