Quindi ho un po 'di codice *, che quando si prendono tre punti, si suppone che restituisca una direzione. Ho scritto questa soluzione, ma ogni volta che provo a farlo funzionare, il GHCi si blocca, quindi mi sto chiedendo cosa sto facendo male. Ecco il codice:Strange Haskell/GHCi problema
--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)
Non c'è ricorsione che posso vedere, quindi non capisco il motivo per cui sta comportando in questo modo. Finora il compilatore Haskell è stato molto esplicito nel dirmi quando sto facendo qualcosa di stupido, ma questo mi ricompensa bene.
* Questa è la domanda 9 del capitolo 3 di "Real World Haskell" nel caso ve lo stiate chiedendo.
Sei sicuro, che le tue dichiarazioni di dati significano, cosa pensi che significano? Al momento, potresti avere un punto [stringa] (punto, vettore), solo per nominare un tipo di punta sciocco. In base al tuo utilizzo, non sarebbe meglio dichiarare i dati Point = Point Int Int derivante (Eq, Show)? – Boris