【发布时间】:2012-05-18 19:59:42
【问题描述】:
似乎弗雷格关于类型类的想法与 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提供了默认实现。这应该意味着
应该可以。但这行得通吗:
实例 Foo FB 在哪里 富二 = ... foo3 = ... 实例吧 FB 在哪里 酒吧1 = ... 酒吧2 = ... 酒吧3 = ...- 那么,如果我在类声明中将方法声明为
native,那只是为该方法设置默认实现?
所以如果我做类似的事情
类 Foobar f 在哪里 foo :: f -> Int 本地富 bar :: f -> 字符串 本地酒吧那么这只是意味着如果我为某个 Java 原生类编写了一个空实例声明,那么foo 映射到 Java 中的object.foo()?
特别是,如果一个类方法被声明为native,如果我选择,我仍然可以为它提供一些其他实现吗?
- 每个类型 [构造函数] 都是一个命名空间。我知道这对臭名昭著的命名字段问题有什么帮助。我不确定你为什么要在这个命名空间的范围内声明其他东西......
【问题讨论】:
标签: class types functional-programming frege