Пусть будет открытой, это же ничему не помешает.
Помешает коллизиями имён методов, ну и если не удастся назвать все новые классы не как старые (а вдруг там хорошее имя окажется), то и имён классов.
Но сама перегрузка использования одного обозначения для многих смыслов меня напрягает.
Ну, видимо, пороги у всех немного разные, но в среднем наверняка мы все сходимся.
Кроме такой экстенсивной перегрузки и добавления суперсуперклассов для большой кучи конкретных классов ещё можно, конечно, делать обёртки у инстансов, например я вполне удовлетворён тем, что делается для
Monoid/
Semigroup уже из настоящего пакета
base (с отдельными именами для операции — вот тут OK) и их инстансов (
Min,
Max,
Any,
All,
First,
Last и какая ещё там куча).
Это как в математике - один использовал большие буквы для обозначения множеств, а другой для групп, при этом я читая первого что-то понимал, а перешёл на другого - перестал понимать.
Ну второй может недопояснил, и если так, это его реальная вина, но про то, что хороший пакет должен быть хорошо документирован, мы все знаем.
Возможно же ещё умножение.
Да, конечно. Потому я отчасти за то, что у настоящих классов моноидов и полугрупп хаскеля операция обозначается
<>, а не плюсом или умножением. Числовые и многие другие классы, однако, часто вертятся вокруг структур, подобных кольцу, вот там и сложению, и умножению место. Разных видов колец как раз много надо, чтобы не требовать
mod в не евклидовом кольце и т. п..
Как говорят - краткость, конечно же сестра таланта, но в некоторых случаях талантам от этого ничуть не лучше :)
Ну, в реальном коде действительно удлинил бы или написал документацию, тут понадеялся. :) Вообще тот пример можно понимать чисто синтаксически, у меня фантазии просто не было.
Это псевдо-код? А то ведь не хаскель.
(Уже написали, пока я закопался в статью про возникновение типоклассов и пошёл гулять по ссылкам, но пусть уж останется.)
С расширениями
MultiParamTypeClasses (это вроде в Haskell2010 входит, но не помню) и
FunctionalDependencies компилируется (кстати они ведь в той статье про историю хаскеля тоже упомянуты! ну, без формальных названий). Если смутила часть
| a b -> c, то это описание функциональной зависимости, позволяющее проще выводить инстансы (и не позволять определять некоторые). В данном случае оно нужно, чтобы если мы знали
a и
b, мы могли бы определить однозначно и
c. Это запретит, например, написать пару инстансов
HasPlus A B C1 и
HasPlus A B C2 или, скажем,
Show a => HasPlus A B a.
Когда нужно учить множество простых определений, получается препятствие. Они все простые и выводы из них простые (как бывает в теории групп), но без того, что бы вспомнить все нужные определения вывод просто не понять. И без длительного запоминания это невозможно (ну у меня не получилось). Это откровенно плохое последствие.
Я ещё забыл упомянуть, что хорошая реорганизация классов старается оставить имена старых методов как были. Тогда если мы помним как раньше писали, сможем и дальше так же продолжать. Насколько я смотрел примеры альтернатив
Prelude (и численных, и вообще), там это в общем выполняется.
Вообще лично мне помогает вспоминать вещи точечная запись ООП-языков (нажимаешь точку, и IDE тебе выкати весь список), но уж чего тут нет, того нет. И идеальный в этом отношении язык бы имел не просто точечную запись, но и предлагал бы кроме истинных методов того, что слева от точки, всякие функции, берущие его первым аргументом (неравенство, но пользу приносит), так же как и воспринимал бы в общем случае подобную запись a.f(…) как f(a, …), и парочка языков с такой фичей даже есть (Nim и Koka вроде точно да, но могут быть и ещё), но я на них ничего не писал.Там стояла задача что-то сделать с перегрузкой операций при работе с числами (любого типа). Это начали обсуждать, потом в процессе обсуждения один недопонял другого, и повернул его слова именно в сторону темы обсуждения, то есть - как изящно побороть перегрузку.
Угу, тоже там читал.
а мультиметоды - на этапе выполнения
Ну да, просто потому что обычно присутствуют они в динамически типизированном языке, где недостаточно средств, чтобы сделать проверку при компиляции, но в принципе в каком-нибудь неизвестном нам языке разрешение метода может быть и статическим.