Кажется, что идеи Фреге о классах типов значительно отличаются от Хаскеля. В частности:
Синтаксис кажется другим по непонятной причине.
Типы функций не могут иметь экземпляров классов. (Кажется, довольно странное правило...)
Спецификация языка что-то говорит о реализации суперклассов в объявлении экземпляра подкласса. (Но не в том случае, если у вас алмазное наследование... это не будет ошибкой, но не гарантируется, что это как-то сработает?)
Фреге меньше беспокоится о том, как выглядит экземпляр. (Псевдонимы типов разрешены, переменные типов не обязаны быть разными и т. д.)
Методы могут быть объявлены как native
, хотя не совсем ясно, что это означает.
Похоже, вы можете написать type.method
для доступа к методу. Опять же, никаких указаний на то, что это означает или почему это полезно.
Объявления подклассов могут предоставлять реализации по умолчанию для методов суперкласса. (?)
Короче говоря, было бы полезно, если бы кто-то, кто разбирается в этом, мог написать объяснение того, как это работает. Он указан в спецификации языка, но описания немного кратки.
(Что касается синтаксиса: я думаю, что синтаксис экземпляра Haskell более логичен. «Если X является экземпляром Y и Z, то он также является экземпляром Q следующим образом...Синтаксис класса Haskell всегда казался мне немного странным. Если X реализует Eq
, это не означает , что он реализует Ord
, это подразумевает, что он можетреализовать Орд
, если захочет. Хотя я не уверен, какой символ лучше...)
Ответ Инго:
Например, предположим, что Foo
является суперклассом Bar
. Предположим, что каждый класс имеет три метода ( foo1
, foo2
, foo3
, bar1
, bar2
, bar3
), а Bar
предоставляет реализацию по умолчанию для foo1
. Это должно означать, что
instance Bar FB where foo2 = ... foo3 = ... bar1 = ... bar2 = ... bar3 = ...
должно работать. Но будет ли это работать:
instance Foo FB where foo2 = ... foo3 = ... instance Bar FB where bar1 = ... bar2 = ... bar3 = ...
native
в объявлении класса, который просто устанавливает реализацию defaultнция для этого метода?Итак, если я делаю что-то вроде
class Foobar f where foo :: f -> Int native foo bar :: f -> String native bar
, это просто означает, что если я пишу объявление пустого экземпляра для некоторого собственного класса Java, то foo
сопоставляется с object.foo()
в Java?
В частности, если метод класса объявлен как native
, я все равно могу предоставить для него некоторую другуюреализацию, если захочу?