[英]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.