Обычно кажется незаконным следующее:
class Foo a where
foo :: a -> b -> a
Что имеет смысл; откуда мы знаем, что такое b
?
Однако, если мы посмотрим на определение Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
мы видим, что a
и b
появляются, хотя мы указываем только f
как переменную типа. Я предполагаю, что это разрешено, потому что компилятор видит, например. f a
и может вычислить, что f
сам должен принимать a
, так что можно безопасно использовать этот a
в другом месте нашего определения Functor. Я прав?