Vladislav
не знаю что там после классов у математиков, у агдистов множество_2
Vladislav
(то есть что там у математиков классы содержит)
Евгений
класс это множество_1
Класс это не множество
Vladislav
Евгений
Потому что на них нету принадлежности
Ilya
Вот чтобы хоть немного осмыслить разговор, в хаскеле в качестве дефолтного элемента можно было бы выбирать первое дерево АТД. Правда этот элемент будет бесполезен, но всё же такой выбор можно сделать для всех АТД, то есть для всех в хаскеле, кроме функций
Ilya
Например для списка это будет либо [] либо def:def:def:def...
Vladislav
кана
У нас вообще не может быть опрации. Это все равно что говорить что в моноидах так операция и ноль подобраны чтобы на них можно было монаду построить
в моноидах так операция и 0 подобраны, чтобы на них можно было моноид построить то есть нуль без операции смысла не имеет, а вот обратное верно для полугрупп
Ilya
Например для списка это будет либо [] либо def:def:def:def...
В зависимости от того, какой конструктор стоит первый там у списка, не помню
Евгений
> вне теории множеств класс это баззворд, эпитет
Anonymous
Stop it please. В чем смысл вашей олимпиады?
Евгений
А в теории множеств класс это более широкое понятие чем множество
eahqzsr
твое утверждение "в любом множестве s есть дефолтный элемент a ∈ s" ну во-первых это неверно для пустого множества
Я не утверждал такого. Давай так - пара {S, d} является множеством с дефолтным элементом если d принадлежит S. По анологии с моноидом, но без операции
Vladislav
ну а в теории множеств он либо неформальный (т.е. баззворд, эпитет), либо "семейство, которое не может быть элементом других семейств" (aka множество_1, Set_1 в Agda)
Vladislav
так что не могу проследовать за цепочкой рассуждений
eahqzsr
Никак. Это абстракция
Vladislav
Ну раз никак не выбирать, значит его и не будет
Евгений
Эм, в классической математике не требуется конструктивности
eahqzsr
Все равно что в определении моноида сказать "как операцию выбирать будешь"?
Евгений
Не обязательно выбирать, чтобы доказать существование
Vladislav
Все равно что в определении моноида сказать "как операцию выбирать будешь"?
ок, я понял, зависимости нет. Тогда Default не может быть классом в Haskell
Vladislav
потому что Default выбирает уникально тёрм по типу
Vladislav
потому что классы выбирают тёрм по типу
Vladislav
ты говоришь классу тип, он даёт тебе тёрм
Vladislav
Monoid (Sum Integer) дает тебе { (<>) = (+), mempty = 0 }
Vladislav
ну в смысле да, конечно можно сделать по ньютайп-обертке на каждый дефолтный элемент и пользоваться классом, но смысл-то тогда вообще отсутствует абсолютно
eahqzsr
Хорошо Default (Sum Integer) даст { def = 0 }
кана
не очень понятно, в чем смысл этого Default вне контекста моноида
Vladislav
а Default (Product Integer) даст { def = 1 }
кана
типа дефолтный для чего это вообще
Vladislav
тогда это mempty просто, и без <> ты бы правильное значение не выбрал
Vladislav
о чём и речь
кана
тогда и Sum не будет
eahqzsr
В конфиге например
Vladislav
тогда и Sum не будет
вот-вот, Sum-то вообще в честь операции и назван
кана
Хорошо Default (Sum Integer) даст { def = 0 }
тут ты выбрал дефолтный ПО ОПЕРАЦИИ, а потом говоришь, что операция не нужна, тут mutual взаимосвязь, убрав один не будет и другого
кана
в конфиге у тебя будет своя операция (иначе зачем там дефолт), вот для нее и будет моноид с твоим дефолтным конфигом
Vladislav
В конфиге например
В конфиге операция - это программа, которую ты конфигурируешь. Она Config -> IO (), условно говоря.
Vladislav
Поэтому дефолты там выбираются по поведению этой программы
Vladislav
Если у тебя какой-то язык конфигов, который от программы не зависит (например YAML), то не может быть там дефолтов
eahqzsr
Предположим что операция не ассоциативна
Vladislav
Я вообще не говорю про ассоциативные операции или моноиды, потому что mempty и def явно разные вещи
Vladislav
Это у тебя было утверждение, что они одно и то же, и что надо сделать Default m => Monoid m
кана
тогда это будет структура { M: Set , f: M -> M -> M , e: M, , p: (forall x in M) f x e = f e x = x }
кана
не знаю, есть ли у нее имя, но структура есть (имя не первично)
eahqzsr
Это у тебя было утверждение, что они одно и то же, и что надо сделать Default m => Monoid m
Они могут быть одним и тем же. И дефолтная реализация mempty = def
кана
могут быть, но "могут быть" - явно слабое условие для того, чтобы делать наследование
eahqzsr
Да ладно. Для каждого моноида сделать инстанс Default
Vladislav
А если нет инстанса моноида, то какой операцией выбирать значение def?
eahqzsr
То же самое как Monad наследует Applicative
Vladislav
Уже проходили этот вариант
Vladislav
instance Default Integer where def = 42 change my mind
кана
да вот я сделал data X = A | B | C instance Default X where def = C instance Monoid X where mempety = A (<>) A x = x (<>) x A = x (<>) B C = A (<>) C B = A (<>) B B = C (<>) C C = B
кана
какая тут связь дефолта с моноидом вообще
eahqzsr
instance Default Integer where def = 42 change my mind
А почему бы не определить для Integer моноид со сложением по модулю 2 например?
Vladislav
потому что 42 мне больше нравится ты же сказал произвольно
Vladislav
я похоже не на тот вопрос ответил
Vladislav
Monoid для Integer вообще определять не нужно, потому что их существует >1
eahqzsr
Ну я могу и моноид для инта написать например mempty = 0 mconcat a b = 0 потому что мне нравится. И дальше что?
кана
инстанс класса Monoid, имеется в виду конечно, так-то без классов можно продолжать энкодить моноиды в любом количестве и явно указывать, какой и куда
кана
вот выше я описал тип для конфига
кана
и дефолтное значение хочу C
Vladislav
во-первых потому что mconcat :: [m] -> m
кана
но нейтральным элементом это не будет
Vladislav
во-вторых если ты имел в виду mappend a b = b, то это не удовлетворяет свойству mappend a mempty = a
Vladislav
так что это не моноид