In Haskell, it letis a recursive binding, that is, you can refer to variables declared in an expression letin the defining expressions of other variables. So when you write
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
, .