Подтвердить что ты не робот

Что такое соглашение об именах для классов в Scala?

В мире Java соглашения об именах для интерфейсов довольно хорошо установлены. Например, когда вы говорите, что определенный класс реализует интерфейс Comparable, вы можете сказать, что его объекты сопоставимы. Однако соглашения об именах для типов классов не так хорошо установлены. Например, Int имеет Numeric неявный доступ, поэтому вы можете сказать: "Int - это тип Numeric". Но тогда есть typeclass Ordering. Я не понимаю, почему это имя было выбрано. "Int - это тип Ordering" не имеет никакого смысла. Возможно, он должен быть прочитан как "Int имеет тип Ordering". Тогда в Scalaz есть Equal и Show. Я совершенно не понимаю, почему эти имена были выбраны (кроме того, что они так в Haskell.) Я попытался взглянуть на Haskell, материнский язык typeclasses, для хорошего соглашения об именах, но обнаружил, что их действительно не существует. Ребятам из Haskell действительно не нравятся имена (это то, что я собрал в дискуссиях по рассылке). Но, исходя из Java-мира, меня волнуют имена. Я не совсем в состоянии привыкнуть к парадигме "типы говорят все".

Вопрос: какие соглашения об именах вы используете, если это вообще возможно, для присвоения имен классам?

4b9b3361

Ответ 1

На самом деле, вещи в основном просто просты в Haskell: классы типов обычно называются на основе того, что представляют собой операции, а не того, что представляет собой параметр типа.

Например:

  • Read, Show: классы типов, для которых определены стандартные функции сериализации/десериализации строк.
  • Eq, Ord: классы типов, для которых определены отношения равенства и упорядочения соответственно.
  • Enum: класс типов, определяющий операцию "преемника", т.е. значения которых могут быть перечислены.
  • Monoid, Functor, Monad: классы типов, которые определяют операции, связанные с аналогично названными математическими структурами.

Некоторые примеры не так хороши: например, Num - это класс типов, для которых определен ad-hoc-набор неопределенно-арифметико-ориентированных операций, но нет причин, чтобы экземпляр Num должно фактически быть числом в любом обычном смысле. Возможно, это можно было бы перенаправить как "типы, поддерживающие числовые операции", притворяясь, что "числовой" фактически означает что-либо в этой фразе.

Короче говоря, Numeric, вероятно, является плохим примером для подражания, и если класс типа имеет только одну функцию (возможно, с несколькими вариантами), почти всегда можно назвать класс после этой функции, как в случае Show против Show.

Но на самом деле главное - думать в терминах функций класса type, а не параметра типа. Подумайте, глаголы, а не существительные. Существительные - все равно глупые инертные вещи, поэтому мышление с точки зрения действий и операций, вероятно, приведет к улучшению дизайна программы.