Я записал функцию в 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
, однако, продолжает бежать навсегда.
Кто-то может сказать мне, где проблема здесь?
в 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
и изменяют ваши более поздние вычисления соответствующим образом, и ваш бесконечный цикл исчезнет.