В файле, я пытаюсь определить такую функцию:Типы: (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,], но почему мне приходится беспокоиться о поплавках?
Вот где пример из, хотя позже в разделе рекурсии , В любом случае, насколько я знаю, я должен объявить «ограничения типа» с помощью синтаксиса: (SomeType a) =>, и я хочу объявить ограничение типа Int, которое применяется к первой переменной параметра. – 7stud
Да, но 'Int' - это тип, а не тип. Ближайшим классом типа, вероятно, является «Интеграл». – yiding
Хорошо, я не понял различия между типами и typeclasses при указании «ограничения типа/класса». Похоже, что они должны быть известны только как «ограничения типов». Благодарю. – 7stud