2010-07-09 32 views
3

具體來說,我想做的事情是這樣的:當我嘗試加載此通過ghci我得到如何爲Haskell的集合生成器表示法指定類型?

Warning: Defaulting the following constraint(s) to type `Integer' 
     `Integral t' arising from a use of `^' at myfunc.hs:76:20-22 

所以我知道X顯然應該是一個Integer

myfunc:: [(Integer, Integer)] 
myfunc = [(x^2 - y^2, 2 * x * y) | x <- [1..], y <- [1.. (x-1)]] 

,我該怎麼辦繼續讓Haskell知道我想要什麼?

+3

'[(x * x - y * y,....' – kennytm 2010-07-09 14:03:55

回答

11

這裏的問題是,^(Num a, Integral b) => a -> b -> a類型,所以^的第二個參數可以是任何整數類型。因爲結果類型是Integer Haskell知道a是Integer,但它對b一無所知。不知道該怎麼辦,它默認爲Integer併產生警告。由於在這種情況下這完全可以,所以您可以忽略或禁用警告。

但是,如果你寧願添加類型標註作出明確要正確操作有整數類型,你可以這樣做是這樣的:

(x^(2::Integer) - y^(2::Integer), 2 * x * y) 

一點題外話:[]創建一個列表,不是一套。

+2

是的,一個列表。它通常被稱爲「列表理解」。 – 2010-07-09 16:41:37

+0

謝謝,重寫爲x * x做出警告走開。 – agam 2010-07-09 23:34:01

2

更具體地說,警告是關於2,而不是關於x(或y)。

KennyTM的建議或將其寫入(x x - y y,...)會使警告消失。

此外,請注意這是一個警告 - 您的系統似乎已設置爲在您的程序中提供儘可能多的警告(「-Wall」),這是掌握編譯器認爲您的好方法正在做。既然這只是一個警告,你可以隨意忽略它;它會做你想要的。爲了更好地學習系統,獲得人們對爲什麼發出警告的意見是很好的。

相關問題