gpt4 book ai didi

Haskell 函数不会终止

转载 作者:行者123 更新时间:2023-12-02 12:17:31 25 4
gpt4 key购买 nike

我用 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 中测试了 collinear1angleturnAtP,它们都立即终止。然而,detDirection 会永远运行。

有人能告诉我问题出在哪里吗?

最佳答案

在Haskell中,let是一种递归绑定(bind),也就是说,你可以在其他变量的定义表达式中引用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

第一行的x1x2y1y2不引用该函数参数,但使用稍后在 let 表达式中声明的相同名称。只需更改两条 Point 线即可绑定(bind)一些不同的变量,例如

        (Point (x3, y3))    = turnAtP a b angleAbX
(Point (x4, y4)) = turnAtP a c angleAbX

并相应地修改您以后的计算,您的无限循环就会消失。

关于Haskell 函数不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com