2010-01-24 16 views
5

Ho scritto una funzione in Haskell che prende tre punti nell'aereo, e controlla se sono su una linea retta, o svoltiamo a destra oa sinistra.La funzione Haskell non termina

Here's codice:

detDirection :: Point -> Point -> Point -> Direction 

detDirection [email protected](Point (x1, y1)) [email protected](Point (x2, y2)) c 

= if (collinear1 a b c) 
    then Straight 
    else let 
      ab     = Vector [x2 - x1, y2 - y1] 
      angleAbX   = angle ab (Vector [1, 0]) 
      (Point (x1, y1)) = turnAtP a b angleAbX 
      (Point (x2, y2)) = turnAtP a c angleAbX 

      in if (y1 > y2) 
       then Right 
       else Left 

Ive testato collinear1, angle, turnAtP in GHCi, e tutti terminano immediatamente. detDirection, tuttavia, continua a funzionare per sempre.

Qualcuno può dirmi dove si trova il problema?

+0

Provato a percorrerlo linea per linea? –

+5

Attiva gli avvertimenti (': set -Wall' in GHCi) e otterrai indicazioni chiare su ciò che hai sbagliato. – ephemient

risposta

15

In Haskell, let è un'associazione ricorsiva, ovvero è possibile fare riferimento alle variabili dichiarate nell'espressione let nelle espressioni di definizione delle altre variabili. Così, quando si scrive

let 
     ab     = Vector [x2 - x1, y2 - y1] 
     angleAbX   = angle ab (Vector [1, 0]) 
     (Point (x1, y1)) = turnAtP a b angleAbX 
     (Point (x2, y2)) = turnAtP a c angleAbX 

il x1, x2, y1, e y2 sulla prima riga non si riferiscono agli argomenti della funzione, ma per gli stessi nomi dichiarati in seguito nella let espressione. Basta cambiare le due Point linee di legare alcune variabili diverse, come

 (Point (x3, y3)) = turnAtP a b angleAbX 
     (Point (x4, y4)) = turnAtP a c angleAbX 

e modificare il calcolo tardi di conseguenza, e il vostro loop infinito andrà via.

+1

Grazie mille, Non riesco a credere di aver effettivamente oscurato gli argomenti della mia funzione senza accorgermene ..... La prossima volta userò gli avvisi in GHCi! – Ben

Problemi correlati