2
在一個文件,我想這樣定義一個函數:類型:(數字a,數字a)與(數字a)?
myReplicate :: (Int a) => a -> b -> [b]
myReplicate n x
| n <= 0 = []
| otherwise = x : myReplicate (n-1) x
買的時候我嘗試加載文件到ghci中,我得到這個錯誤:
ghci>:l 1.hs
[1 of 1] Compiling Main (1.hs, interpreted)
1.hs:38:17:
`Int' is applied to too many type arguments
In the type signature for `myReplicate':
myReplicate :: Int a => a -> b -> [b]
Failed, modules loaded: none.
ghci的告訴我, myReplicate的類型應該是:
ghci>:t myReplicate
myReplicate :: (Num a, Ord a) => a -> a1 -> [a1]
如果我改變類型聲明什麼ghci的建議:
myReplicate :: (Num a, Ord a) => a -> b -> [b]
...然後函數編譯和'工作'。然而,「作品」是這樣的:
ghci>myReplicate 3.2 1
[1,1,1,1]
爲什麼我不能宣佈myReplicate只需要一個Int作爲第一個參數(也是在那詮釋下降(事實上光)從奧德班?) ?我想我可以把我的第一個後衛換成x < 1,這樣myReplicate 3.2 1就會產生[1,1,1],但是爲什麼我必須打擾漂浮物呢?
這其中的例子來自,儘管後來在遞歸節。在任何情況下,據我所知,我應該使用以下語法聲明「類型約束」:(SomeType a)=>,並且我想聲明適用於第一個參數變量的Int類型約束。 – 7stud 2013-05-02 02:38:30
是的,但'Int'是一個類型,而不是一個類型類型。最接近的類型可能是'Integral'。 – yiding 2013-05-02 02:40:38
好的,在指定「類型/類約束」時,我沒有看到類型和類型類之間的區別。看起來他們應該只被稱爲「類型約束」。謝謝。 – 7stud 2013-05-02 02:48:06