J'ai donc un peu de code *, qui en prenant trois points, est supposé renvoyer une direction. J'ai écrit cette solution, mais chaque fois que j'essaie de la faire fonctionner, cela bloque le GHCi, donc je me demande ce que je fais de mal. Voici le code:Strange Haskell/GHCi issue
--chapter 3 question 9
data Point x y = Point x y deriving (Eq, Show)
data Vector x y = Vector x y deriving (Eq, Show)
sub (Point x y) (Point a b) = (Vector (x-a) (y-b))
dot (Vector x y) (Vector a b) = (x*a)+(y*b)
perp (Vector x y) = (Vector (-y) x)
mag (Vector x y) = sqrt (dot v v) where v = (Vector x y)
data Direction = LeftTurn | RightTurn | Straight | Reverse | Stop | Undefined
deriving (Eq, Show)
getDirection (Point a b) (Point c d) (Point e f)
| a/=c && b/=d && c==e && d==f = Stop
| a==c && b==d || c==e && d==f || e==a && f==b = Undefined
| d > 0 = LeftTurn
| d < 0 = RightTurn
| otherwise = Straight
where d = dot (sub p1 p0) (perp (sub p2 p1))
where p0 = (Point a b)
p1 = (Point c d)
p2 = (Point e f)
Il n'y a pas récursion que je peux voir, donc je ne comprends pas pourquoi il se comporte de cette façon. Jusqu'à présent, le compilateur Haskell a été très vocal à propos de me dire quand je fais quelque chose de stupide, mais cela compile bien.
* Ceci est la question 9 du chapitre 3 de "Real World Haskell" au cas où vous vous poseriez la question.
Etes-vous sûr que vos déclarations de données veulent dire ce que vous pensez? Pour le moment, vous pourriez avoir un Point [String] (Point, Vector), juste pour nommer un type Point idiot. En fonction de votre utilisation, ne vaudrait-il pas mieux déclarer les données Point = Int Point Int Intiving (Eq, Show)? – Boris