2010-01-24 8 views
5

Haskell'de, uçağın üç noktasını alan ve düz bir çizgide olup olmadığını veya sağa veya sola dönüş yaptığını kontrol eden bir işlev yazdım.Haskell işlevi sonlandırmıyor

Here's kodu:

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 

hep şeffaf GHCi içinde collinear1, angle, turnAtP test edilmiş ve hepsinin hemen sona erer. Ancak, detDirection, sonsuza dek çalışmaya devam ediyor.

Birisi bana burada sorunun nerede olduğunu söyleyebilir mi?

+0

Çizgi boyunca adım atmaya çalıştı mı? –

+5

Uyarıları açın (': GHCi'de -Wall'i ayarlayın) ve yanlış yaptığınız konusunda bazı açık ifadeler alırsınız. – ephemient

cevap

15

Haskell'de let diğer değişkenlerin tanımlanması ifadelerde let ifade bildirilen değişkenler başvurabilir, yani bir özyinelemeli bağlanmasıdır. Ee, ne zaman yazmak

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 

x1, fonksiyon argümanları ancak let ifadesinde daha sonra ilan aynı isimlere atıfta bulunmayan ilk satırda x2, y1 ve y2. Sadece

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

gibi bazı farklı değişkenleri bağlamak için iki Point hatları değiştirmek ve buna göre sonradan hesaplama değiştirme ve sonsuz döngü gidecek.

+1

Çok teşekkür ederim, Gerçekten de işlev argümanlarımı fark etmeden gerçekten gölgelediğime inanamıyorum ..... Bir dahaki sefere uyarıları GHCi'de kullanacağım! – Ben