2013-05-02 2 views
2

В файле, я пытаюсь определить такую ​​функцию:Типы: (Num a, Ord a) против (Int 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 в качестве первого аргумента (также в свете того факта, что Int нисходит() из класса Ord?) ? Думаю, я мог бы изменить свой первый страж, чтобы он был 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

+1

Да, но 'Int' - это тип, а не тип. Ближайшим классом типа, вероятно, является «Интеграл». – yiding

+0

Хорошо, я не понял различия между типами и typeclasses при указании «ограничения типа/класса». Похоже, что они должны быть известны только как «ограничения типов». Благодарю. – 7stud

Смежные вопросы