它通常似乎以下是非法的:Haskell类定义中的隐式类型参数?
class Foo a where
foo :: a -> b -> a
这是合理的;我们怎么知道b
是什么?
但是,如果我们看一下仿函数的定义:
class Functor f where
fmap :: (a -> b) -> f a -> f b
我们看到a
和b
显示出来,即使我们只指定f
作为一个类型变量。我猜这是允许的,因为编译器看到例如f a
,并且可以发现f
本身必须采用a
,所以在我们的Functor定义中的其他地方使用a
是安全的。我对么?