Как работают классы Фреге?

Кажется, что идеи Фреге о классах типов значительно отличаются от Хаскеля. В частности:

  • Синтаксис кажется другим по непонятной причине.

  • Типы функций не могут иметь экземпляров классов. (Кажется, довольно странное правило...)

  • Спецификация языка что-то говорит о реализации суперклассов в объявлении экземпляра подкласса. (Но не в том случае, если у вас алмазное наследование... это не будет ошибкой, но не гарантируется, что это как-то сработает?)

  • Фреге меньше беспокоится о том, как выглядит экземпляр. (Псевдонимы типов разрешены, переменные типов не обязаны быть разными и т. д.)

  • Методы могут быть объявлены как 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, я все равно могу предоставить для него некоторую другуюреализацию, если захочу?

  • Каждый тип [конструктор] является пространством имен. Я понимаю, как это было бы полезно для печально известной проблемы с именованными полями. Я не уверен, почему вы хотите объявлять другие вещи в рамках этого пространства имен...
7
задан Ingo 10 May 2012 в 13:11
поделиться