Vladislav
не знаю что там после классов у математиков, у агдистов множество_2
Vladislav
(то есть что там у математиков классы содержит)
eahqzsr
Vladislav
Евгений
Потому что на них нету принадлежности
Ilya
Вот чтобы хоть немного осмыслить разговор, в хаскеле в качестве дефолтного элемента можно было бы выбирать первое дерево АТД. Правда этот элемент будет бесполезен, но всё же такой выбор можно сделать для всех АТД, то есть для всех в хаскеле, кроме функций
Ilya
Например для списка это будет либо [] либо def:def:def:def...
Vladislav
Vladislav
Евгений
> вне теории множеств класс это баззворд, эпитет
Anonymous
Stop it please. В чем смысл вашей олимпиады?
Евгений
А в теории множеств класс это более широкое понятие чем множество
Vladislav
ну а в теории множеств он либо неформальный (т.е. баззворд, эпитет), либо "семейство, которое не может быть элементом других семейств" (aka множество_1, Set_1 в Agda)
Vladislav
так что не могу проследовать за цепочкой рассуждений
Vladislav
eahqzsr
Никак. Это абстракция
Vladislav
Ну раз никак не выбирать, значит его и не будет
Евгений
Эм, в классической математике не требуется конструктивности
eahqzsr
Все равно что в определении моноида сказать "как операцию выбирать будешь"?
Евгений
Не обязательно выбирать, чтобы доказать существование
Ilya
Vladislav
Vladislav
потому что Default выбирает уникально тёрм по типу
eahqzsr
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
о чём и речь
eahqzsr
кана
тогда и Sum не будет
eahqzsr
В конфиге например
eahqzsr
кана
в конфиге у тебя будет своя операция (иначе зачем там дефолт), вот для нее и будет моноид с твоим дефолтным конфигом
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
кана
могут быть, но "могут быть" - явно слабое условие для того, чтобы делать наследование
eahqzsr
Да ладно. Для каждого моноида сделать инстанс Default
Vladislav
А если нет инстанса моноида, то какой операцией выбирать значение def?
eahqzsr
То же самое как Monad наследует Applicative
eahqzsr
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
кана
какая тут связь дефолта с моноидом вообще
Vladislav
потому что 42 мне больше нравится
ты же сказал произвольно
Vladislav
я похоже не на тот вопрос ответил
Vladislav
Monoid для Integer вообще определять не нужно, потому что их существует >1
eahqzsr
Ну я могу и моноид для инта написать например mempty = 0 mconcat a b = 0 потому что мне нравится. И дальше что?
кана
инстанс класса Monoid, имеется в виду конечно, так-то без классов можно продолжать энкодить моноиды в любом количестве и явно указывать, какой и куда
Vladislav
кана
кана
вот выше я описал тип для конфига
eahqzsr
кана
и дефолтное значение хочу C
Vladislav
во-первых потому что mconcat :: [m] -> m
кана
но нейтральным элементом это не будет
Vladimir
Vladislav
во-вторых если ты имел в виду mappend a b = b, то это не удовлетворяет свойству mappend a mempty = a
Vladislav
так что это не моноид
eahqzsr