我不理解类型类。我在某处读过,将类型类视为类型实现的“接口”(来自OO)是错误的并且具有误导性。问题是,我在将它们视为不同的东西以及这是怎么回事时遇到了问题。
例如,如果我有一个类型类(使用Haskell语法)
class Functor f where
fmap :: (a -> b) -> f a -> f b
与接口[1]有什么不同(Java语法)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
我能想到的一个可能的区别是,在特定调用中使用的类型类实现未指定,而是由环境确定的,也就是说,检查可用的模块以实现该类型。这似乎是可以用OO语言解决的实现工件。例如编译器(或运行时)可以扫描包装程序/扩展程序/ monkey-patcher,以在类型上公开必要的接口。
我想念什么?
[1]请注意f a
,fmap
由于自变量是OO语言,因此已将其从中删除,因此您将在对象上调用此方法。此接口假定f a
参数已固定。