3
类型类与对象接口
我不理解类型类。我在某处读过,将类型类视为类型实现的“接口”(来自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参数已固定。