Haskell函数不会终止

Ben*_*Ben 5 haskell 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
Run Code Online (Sandbox Code Playgroud)

从来就测试collinear1,angle,turnAtP在ghci中,他们都立即终止. detDirection然而,永远运行.

谁能告诉我这里的问题在哪里?

Jaa*_*koK 15

在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
Run Code Online (Sandbox Code Playgroud)

x1,x2,y1,并y2在第一行不涉及函数的参数,但在宣布之后的相同名称let的表达.只需更改两Point行即可绑定一些不同的变量,例如

        (Point (x3, y3))    = turnAtP a b angleAbX
        (Point (x4, y4))    = turnAtP a c angleAbX
Run Code Online (Sandbox Code Playgroud)

并相应地修改你的后续计算,你的无限循环将消失.