Функция Haskell не завершается

Я записал функцию в Haskell, который берет три точки в плоскости и проверяет, находятся ли они на прямой линии или делают правый или левый поворот.

Вот код:

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

detDirection a@(Point (x1, y1)) b@(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

Я протестировал collinear1, angle, turnAtP в GHCi, и они все сразу завершают. detDirection, однако, продолжает бежать навсегда.

Кто-то может сказать мне, где проблема здесь?

5
задан JaakkoK 24 January 2010 в 23:02
поделиться

1 ответ

в haskell, Пусть представляет собой рекурсивный привязку То есть вы можете ссылаться на переменные, объявленные в , пусть выражение в определении выражений других переменных. Итак, когда вы пишете

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 , x2 , y1 , а y2 на первой строке не относятся к Функциональные аргументы, но к тому же имена, объявленные позже в , пусть . Просто измените два точка линий, чтобы связать некоторые разные переменные, такие как

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

и изменяют ваши более поздние вычисления соответствующим образом, и ваш бесконечный цикл исчезнет.

15
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: