
Ilya
17.07.2018
11:20:07

Евгений
17.07.2018
11:20:19
> вне теории множеств класс это баззворд, эпитет

dimiii
17.07.2018
11:20:36
Stop it please. В чем смысл вашей олимпиады?

Евгений
17.07.2018
11:20:50
А в теории множеств класс это более широкое понятие чем множество

Google

shadowjack
17.07.2018
11:20:52

Index
17.07.2018
11:21:03
ну а в теории множеств он либо неформальный (т.е. баззворд, эпитет), либо "семейство, которое не может быть элементом других семейств" (aka множество_1, Set_1 в Agda)
так что не могу проследовать за цепочкой рассуждений

shadowjack
17.07.2018
11:22:20
Никак. Это абстракция

Index
17.07.2018
11:22:57
Ну раз никак не выбирать, значит его и не будет

Евгений
17.07.2018
11:23:17
Эм, в классической математике не требуется конструктивности

shadowjack
17.07.2018
11:23:24
Все равно что в определении моноида сказать "как операцию выбирать будешь"?

Евгений
17.07.2018
11:23:32
Не обязательно выбирать, чтобы доказать существование

Ilya
17.07.2018
11:24:04

Index
17.07.2018
11:24:11
потому что Default выбирает уникально тёрм по типу

shadowjack
17.07.2018
11:24:23

Google

Index
17.07.2018
11:24:44
потому что классы выбирают тёрм по типу
ты говоришь классу тип, он даёт тебе тёрм
Monoid (Sum Integer) дает тебе { (<>) = (+), mempty = 0 }
ну в смысле да, конечно можно сделать по ньютайп-обертке на каждый дефолтный элемент и пользоваться классом, но смысл-то тогда вообще отсутствует абсолютно

shadowjack
17.07.2018
11:26:39
Хорошо Default (Sum Integer) даст { def = 0 }

kana
17.07.2018
11:27:08
не очень понятно, в чем смысл этого Default вне контекста моноида

Index
17.07.2018
11:27:12
а Default (Product Integer) даст { def = 1 }

kana
17.07.2018
11:27:17
типа дефолтный для чего это вообще

Index
17.07.2018
11:27:24
тогда это mempty просто, и без <> ты бы правильное значение не выбрал
о чём и речь

shadowjack
17.07.2018
11:27:30

kana
17.07.2018
11:27:39
тогда и Sum не будет

shadowjack
17.07.2018
11:27:42
В конфиге например

Index
17.07.2018
11:27:56

kana
17.07.2018
11:28:08

shadowjack
17.07.2018
11:29:12

kana
17.07.2018
11:29:14
в конфиге у тебя будет своя операция (иначе зачем там дефолт), вот для нее и будет моноид с твоим дефолтным конфигом

Index
17.07.2018
11:29:16
В конфиге например
В конфиге операция - это программа, которую ты конфигурируешь. Она Config -> IO (), условно говоря.
Поэтому дефолты там выбираются по поведению этой программы
Если у тебя какой-то язык конфигов, который от программы не зависит (например YAML), то не может быть там дефолтов

Google

shadowjack
17.07.2018
11:30:26
Предположим что операция не ассоциативна

Index
17.07.2018
11:31:03
Я вообще не говорю про ассоциативные операции или моноиды, потому что mempty и def явно разные вещи
Это у тебя было утверждение, что они одно и то же, и что надо сделать Default m => Monoid m

kana
17.07.2018
11:31:55
тогда это будет структура
{ M: Set
, f: M -> M -> M
, e: M,
, p: (forall x in M) f x e = f e x = x
}
не знаю, есть ли у нее имя, но структура есть (имя не первично)

shadowjack
17.07.2018
11:32:32

kana
17.07.2018
11:33:03
могут быть, но "могут быть" - явно слабое условие для того, чтобы делать наследование

shadowjack
17.07.2018
11:33:44
Да ладно. Для каждого моноида сделать инстанс Default

Index
17.07.2018
11:34:12
А если нет инстанса моноида, то какой операцией выбирать значение def?

shadowjack
17.07.2018
11:34:14
То же самое как Monad наследует Applicative

Index
17.07.2018
11:34:43
Уже проходили этот вариант

Index
17.07.2018
11:34:58
instance Default Integer where
def = 42
change my mind

kana
17.07.2018
11:35:47
да вот я сделал
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
какая тут связь дефолта с моноидом вообще

shadowjack
17.07.2018
11:36:58

Index
17.07.2018
11:37:15
потому что 42 мне больше нравится
ты же сказал произвольно
я похоже не на тот вопрос ответил
Monoid для Integer вообще определять не нужно, потому что их существует >1

shadowjack
17.07.2018
11:38:46
Ну я могу и моноид для инта написать например mempty = 0 mconcat a b = 0 потому что мне нравится. И дальше что?

Google

kana
17.07.2018
11:38:54
инстанс класса Monoid, имеется в виду конечно, так-то без классов можно продолжать энкодить моноиды в любом количестве и явно указывать, какой и куда

Index
17.07.2018
11:39:16

kana
17.07.2018
11:39:19
вот выше я описал тип для конфига

shadowjack
17.07.2018
11:39:31

kana
17.07.2018
11:39:38
и дефолтное значение хочу C

Index
17.07.2018
11:39:40
во-первых потому что mconcat :: [m] -> m

kana
17.07.2018
11:39:44
но нейтральным элементом это не будет

Admin
ERROR: S client not available

Vladimir
17.07.2018
11:39:51

Index
17.07.2018
11:40:07
во-вторых если ты имел в виду mappend a b = b, то это не удовлетворяет свойству mappend a mempty = a
так что это не моноид

shadowjack
17.07.2018
11:40:32
Да, чёт я загнался

Index
17.07.2018
11:41:21
в-третих если бы даже удовлетворяло, я уже сказал, что есть возможных инстансов >1, то их не надо определять вообще
для Integer возможны как минимум (+) и (*), поэтому нет у него Monoid никакого
а кто определит - тот дурак

Ilya
17.07.2018
11:41:50

Index
17.07.2018
11:41:58
зря

Vladimir
17.07.2018
11:42:23

Google

shadowjack
17.07.2018
11:42:27
Я думаю для любого множества с числом элементов больше 2 число возможных моноидов >1

Index
17.07.2018
11:42:31
(+) и (*) - я опечатался

Vladimir
17.07.2018
11:42:52
Не, второй для ненулевых.

Index
17.07.2018
11:43:14
лучше бы он структурой был
data Monoid m = Monoid { (<>) :: m -> m -> m; mempty :: m }
Но для классов всегда остается вариант выбирать его ньютайпом по крайней мере

shadowjack
17.07.2018
11:44:01
Тут вопрос полезности. Некоторые моноиды полезны в программистской практике

Index
17.07.2018
11:44:07
Т.е. если инстансов >1, то сделать по ньютайпу
как сделано Sum и Product

shadowjack
17.07.2018
11:44:51

kana
17.07.2018
11:44:57

Vladimir
17.07.2018
11:45:30
Вот неявные инстансы классов -- это же компромисс. Очумеешь их все явно передавать.

Ilya
17.07.2018
11:45:43
Вроде всё норм там с 0 и умножением

Index
17.07.2018
11:46:23
Или нет, как с ZipList
я не поддерживаю каждое решение стандарта Haskell, в том числе наличие инстансов от Monoid до Monad для []
или там Functor/Foldable/Traversable для (,)

Алексей Ayaye :)
17.07.2018
11:47:28
у них же естественный смысл есть

Index
17.07.2018
11:47:46
Для этого можно отдельные ньютайпы определить
newtype Second a b = Second (a, b)
deriving Functor
newtype Swap a b = Swap (b, a)
deriving Functor

Vladimir
17.07.2018
11:47:49

Index
17.07.2018
11:47:54
а у (,) нет смысла естественного, это пара просто

shadowjack
17.07.2018
11:48:20
Ну с точки зрения математики все инстансы равны, а с точки зрения программиста иметь дефолтный - удобно