2013-05-02 47 views
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],但是爲什麼我必須打擾漂浮物呢?

回答

6

Int是一個類型,而不是類型類型。你想要的是

myReplicate :: Int -> b -> [b] 

或者可能更精確地

myReplicate :: Int -> Int -> [Int] 

這裏是類型和類型類一個很好的教程:http://learnyouahaskell.com/types-and-typeclasses

+0

這其中的例子來自,儘管後來在遞歸節。在任何情況下,據我所知,我應該使用以下語法聲明「類型約束」:(SomeType a)=>,並且我想聲明適用於第一個參數變量的Int類型約束。 – 7stud 2013-05-02 02:38:30

+1

是的,但'Int'是一個類型,而不是一個類型類型。最接近的類型可能是'Integral'。 – yiding 2013-05-02 02:40:38

+0

好的,在指定「類型/類約束」時,我沒有看到類型和類型類之間的區別。看起來他們應該只被稱爲「類型約束」。謝謝。 – 7stud 2013-05-02 02:48:06

相關問題