Разница в использовании между предопределенными классами типов и базовыми типами

Я читаю некоторые примеры из LYAH и наткнулся на этот фрагмент кода:

replicate' :: (Num i, Ord i) => i -> a -> [a]  
replicate' n x  
  | n <= 0    = []  
  | otherwise = x:replicate' (n-1) x  

Это из онлайн-версии, но у меня также есть копия книги, в которой вместо этого есть:

replicate' :: Int -> a -> [a]  
replicate' n x  
  | n <= 0    = []  
  | otherwise = x:replicate' (n-1) x  

Я попробовал оба из них, и они оба работают, но мой вопрос:

Отличаются ли эти реализации, и когда я должен использовать классы типов вместо обычных типов?

1 ответ

Вторая версия работает только с Int в качестве первого параметра. Первая версия является более общей и работает с любым типом в Num а также Ord. классы типов Num Класс типов определяет основные операции, используемые с числовыми типами. В этом случае, replicate' нужно уметь вычитать 1 из параметра n, Ord определяет операции сравнения. Это необходимо, так как вы используете <=, Обратите внимание, что Int находится в обоих этих классах типов и поэтому поддерживает обе необходимые операции. Объявляя функцию с более общей сигнатурой типа, replicate' может использоваться с любым другим типом, который поддерживает требуемые операции.

Другие вопросы по тегам