似乎弗雷格关于类型类的想法与 Haskell 有很大不同。尤其是:
语法似乎有所不同,没有明显的原因。
函数类型不能有类实例。(似乎是一个相当奇怪的规则......)
语言规范说明了在子类实例声明中实现超类。(但如果你有钻石继承……这不会是一个错误,但不能保证以某种方式工作?)
Frege 对实例的外观不那么挑剔。(类型别名是允许的,类型变量不需要是不同的,等等)
方法可以声明为
native
,尽管它的含义并不完全清楚。看来您可以编写
type.method
访问方法。同样,没有说明这意味着什么或为什么有用。子类声明可以为超类方法提供默认实现。(?)
简而言之,如果知道这些东西的人可以写一个关于这些东西如何工作的解释,那将会很有用。它在语言规范中列出,但描述有点简洁。
(关于语法:我觉得 Haskell 的实例语法比较合乎逻辑。“如果 X 是 Y 和 Z 的实例,那么它也是 Q 的实例,方式如下……” Haskell 的类语法一直显得有点奇怪对我来说。如果 X 实现Eq
了,这并不意味着它实现了Ord
,这意味着它可以实现Ord
,如果它愿意的话。我不确定一个更好的符号会是什么......)
根据英戈的回答:
- 我假设为超类方法提供默认实现仅在您“一次性”声明您的实例时才有效?
例如,假设Foo
是 的超类Bar
。假设每个类都有三个方法(foo1
、foo2
、foo3
、bar1
、bar2
、bar3
),并Bar
为foo1
. 这应该意味着
实例吧 FB 在哪里 富二 = ... foo3 = ... 酒吧1 = ... 酒吧2 = ... 酒吧3 = ...
应该管用。但这会起作用吗:
实例 Foo FB 在哪里 富二 = ... foo3 = ... 实例吧 FB 在哪里 酒吧1 = ... 酒吧2 = ... 酒吧3 = ...
- 所以如果我
native
在类声明中声明一个方法,那只是设置该方法的默认实现?
所以如果我做类似的事情
类 Foobar f 在哪里 foo :: f -> Int 本地富 酒吧 :: f -> 字符串 本地酒吧
那么这只是意味着如果我为某个 Java 本机类编写一个空实例声明,然后foo
映射到object.foo()
Java 中?
特别是,如果一个类方法被声明为native
,如果我选择,我仍然可以为它提供一些其他实现吗?
- 每个类型 [constructor] 都是一个命名空间。我知道这对臭名昭著的命名字段问题有什么帮助。我不确定你为什么要在这个命名空间的范围内声明其他东西......