Вопрос

Таким образом, у меня есть немного кода*, что при получении трех баллов должен вернуть направление. Я написал это решение, но каждый раз, когда я пытаюсь запустить его, это заставляет GHCI заморозить, поэтому мне интересно, что я делаю не так. Вот код:

--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)

Я не могу видеть, что я не понимаю, поэтому я не понимаю, почему это ведет себя так. До сих пор компилятор Haskell очень громко рассказывал мне, когда я делаю что -то глупое, но это все в порядке.

*Это вопрос 9 из главы 3 «Реальный мир Хаскелл» на случай, если вам интересно.

Это было полезно?

Решение

Вы связываете имя дважды. Сначала в схеме Point c d чем в where пункт.

Таким образом, если вы пытаетесь получить доступ к d Связанный шаблоном, вы на самом деле имеете в виду d от where пункт рекурсивно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top