2010-11-09 14 views
5

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.

+1

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

risposta

7

Stai vincolando il nome due volte. Prima nel modello Point c d rispetto alla clausola where.

Pertanto, se si sta tentando di accedere allo d associato al pattern, si sta effettivamente facendo riferimento allo d dalla clausola where in modo ricorsivo.

+0

Grazie, non l'avrei mai capito. – horatius83

+5

Se si esegue GHCi con -Wall verrà visualizzato un avviso a riguardo. –

+2

Oppure, ancora meglio, aggiungi la riga ": set -Wall" al tuo file ~/.ghci. –