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)
application Fonction lie plus étroitement que les opérateurs infixes, donc connected (c,d) : xs
obtient analysé comme (connected (c,d)) : xs
.
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.
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