型クラスに関するフレーゲの考え方は、Haskellとは大きく異なるようです。特に:
明らかな理由もなく、構文が異なっているように見えます。
関数型はクラスインスタンスを持つことはできません。(かなり奇妙なルールのようです...)
言語仕様は、サブクラスインスタンス宣言にスーパークラスを実装することについて何かを述べています。(ただし、ダイヤモンドの継承がある場合はそうではありません...エラーにはなりませんが、何らかの形で機能することが保証されているわけではありませんか?)
Fregeは、インスタンスがどのように見えるかについてあまり煩わしくありません。(型エイリアスは許可され、型変数は区別する必要はありませんなど)
メソッドはとして宣言できますが
native
、これの意味が完全には明確ではありません。type.method
メソッドにアクセスするために書くことができるようです。繰り返しますが、これが何を意味するのか、なぜそれが有用なのかについては何も示されていません。サブクラス宣言は、スーパークラスメソッドのデフォルトの実装を提供できます。(?)
要するに、このようなものを知っている誰かがこのようなものがどのように機能するかについての説明を書くことができれば便利でしょう。言語仕様に記載されていますが、説明は少し簡潔です。
(構文に関して:Haskellのインスタンス構文はより論理的だと思います。「XがYとZのインスタンスである場合、次のようにQのインスタンスでもあります...」Haskellのクラス構文は常に少し奇妙に見えますXが実装する場合、それはそれが実装することを意味するEq
のではなく、必要に応じて実装できることを意味します。しかし、より良いシンボルが何であるかはわかりません...)Ord
Ord
インゴの答えによると:
- スーパークラスメソッドのデフォルトの実装を提供することは、インスタンスを「一度に」宣言した場合にのみ機能すると思いますか?
たとえば、Foo
がのスーパークラスであるとしBar
ます。各クラスに3つのメソッド(、、、、、、)があり、のfoo1
デフォルトfoo2
の実装を提供するfoo3
とします。それはそれを意味するはずですbar1
bar2
bar3
Bar
foo1
インスタンスバーFBここで foo2=..。 foo3=..。 bar1=..。 bar2=..。 bar3=..。
動作するはずです。しかし、これはうまくいくでしょうか:
インスタンスFooFBここで foo2=..。 foo3=..。 インスタンスバーFBここで bar1=..。 bar2=..。 bar3=..。
- それで
native
、クラス宣言のようにメソッドを宣言すると、そのメソッドのデフォルトの実装が設定されるだけですか?
だから私が何かをするなら
クラスFoobarfここで foo :: f-> Int ネイティブfoo バー::f->文字列 ネイティブバー
つまり、Javaネイティブクラスの空のインスタンス宣言を記述した場合、 Javaでfoo
マップするということobject.foo()
です。
特に、クラスメソッドがとして宣言されている場合でも、必要に応じて他の実装をnative
提供できますか?
- すべての型[コンストラクター]は名前空間です。それが悪名高い名前付きフィールドの問題にどのように役立つかがわかります。この名前空間のスコープで他のものを宣言したい理由がわかりません...