簡體   English   中英

Haskell函數不會終止

[英]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中測試了collinear1angleturnAtP ,它們都立即終止。 然而, 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

第一行中的x1x2y1y2不是引用函數參數,而是引用稍后在let表達式中聲明的相同名稱。 只需更改兩條Point線即可綁定一些不同的變量,例如

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

並相應地修改你的后續計算,你的無限循環將消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM