2012-03-15 37 views
16

我知道他們不支持跨模式匹配(即,您需要爲每個模式重寫'where'子句),但是對於警衛員的範圍工作如何?在Haskell中,處理守衛時where子句的範圍是什麼?

例如這是否工作?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
    | x1 < x2 = addOne x2 
    | otherwise = x1 
     where addOne = (1+) 

還是應該是這個?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
     where addOne = (1+) 
    | x1 < x2 = addOne x2 
     where addOne = (1+) 
    | otherwise = x1 

回答

16

第一個是正確的。我建議你看看haskell wiki上的let vs where頁面,這是一個很好的閱讀(並解釋瞭如何處理範圍界定)。正如一個註釋,你永遠不應該重複相同的定義......這是一個標誌,你的代碼需要以另一種方式進行結構化。

5

where子句的範圍是整個等式,因此您的第一個示例工作。