Можно подумать, что Ord a
и Num a
являются дополнительными входами для функции. Это особый вид ввода: словари . При использовании этой функции с конкретным типом a
также должны быть доступны словари для операций Ord
и Num
с типом a
.
Любая функция, которая использует функцию со словарными входами, также должна иметь такие же словарные входы.
foo :: (Num a, Ord a) => a -> t
foo x = loop x someFunc someT
Однако вам не нужно явно передавать эти словари. Haskell позаботится об этом за вас, при условии, что есть доступный словарь. Вы можете создать словарь с экземпляром класса .
instance Num MyType with
x + y = ...
x - y = ...
...
Это создает словарь для операций Num
над MyType
, поэтому MyType
можно использовать везде, где Num a
является обязательным входом (конечно, при условии, что он удовлетворяет другим требованиям).