В Haskell let
является рекурсивной привязкой, то есть вы можете ссылаться на переменные, объявленные в выражении let
в определяющих выражениях других переменных. Итак, когда вы пишете
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
в первой строке относятся не к аргументам функции, а к тем же именам, объявленным позже в выражении let
. Просто измените две строки Point
, чтобы связать несколько разных переменных, например
(Point (x3, y3)) = turnAtP a b angleAbX
(Point (x4, y4)) = turnAtP a c angleAbX
и соответственно измените ваши более поздние вычисления, и ваш бесконечный цикл исчезнет.