[英]Haskell function does not terminate
我在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
我在GHCi中测试了collinear1
, angle
, turnAtP
,它们都立即终止。 然而, detDirection
永远保持运行。
谁能告诉我这里的问题在哪里?
在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
并相应地修改你的后续计算,你的无限循环将消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.