eahqzsr
Да, чёт я загнался
Vladislav
в-третих если бы даже удовлетворяло, я уже сказал, что есть возможных инстансов >1, то их не надо определять вообще
Vladislav
для Integer возможны как минимум (+) и (*), поэтому нет у него Monoid никакого
Vladislav
а кто определит - тот дурак
Vladislav
зря
eahqzsr
Я думаю для любого множества с числом элементов больше 2 число возможных моноидов >1
Vladislav
(+) и (*) - я опечатался
Vladimir
Не, второй для ненулевых.
Vladislav
лучше бы он структурой был data Monoid m = Monoid { (<>) :: m -> m -> m; mempty :: m }
Vladislav
Но для классов всегда остается вариант выбирать его ньютайпом по крайней мере
eahqzsr
Тут вопрос полезности. Некоторые моноиды полезны в программистской практике
Vladislav
Т.е. если инстансов >1, то сделать по ньютайпу
Vladislav
как сделано Sum и Product
Vladimir
Вот неявные инстансы классов -- это же компромисс. Очумеешь их все явно передавать.
Ilya
Вроде всё норм там с 0 и умножением
Vladislav
Или нет, как с ZipList
я не поддерживаю каждое решение стандарта Haskell, в том числе наличие инстансов от Monoid до Monad для []
Vladislav
или там Functor/Foldable/Traversable для (,)
Алексей ayaye :)
у них же естественный смысл есть
Vladislav
Для этого можно отдельные ньютайпы определить newtype Second a b = Second (a, b) deriving Functor newtype Swap a b = Swap (b, a) deriving Functor
Vladimir
Вроде всё норм там с 0 и умножением
Да, похоже, что норм. Я не прав про (*).
Vladislav
а у (,) нет смысла естественного, это пара просто
eahqzsr
Ну с точки зрения математики все инстансы равны, а с точки зрения программиста иметь дефолтный - удобно
Vladislav
потому что зря
A64m
нет
Алексей ayaye :)
с парой там minimum только неестественно работает, как я понял )
кана
вообще возможно было бы полезно явно задать дефолтный инстанс в каком-то контексте, но не иметь дефолтный глобально
кана
это как утверждение "Возьмем моноид для чисел по сложению, тогда ..." и все в скоупе будет про него
Vladislav
нет
как выбирать-то дефолтный? каждому инстансу по ньютайпу, если не уникален
A64m
нет, для всего, для чего инстанс может быть определен - он должен быть определен. если их может быть много выбрать один из общих соображений - остальные через обертки
Vladislav
"один из общих соображений" ок, пойду-ка отсюда
A64m
ну, а как вообще все решения делаются по стандартной библиотеке?
Vladislav
я не считаю что руководствоваться "общими соображениями" это способ написать код или вообще что-то хорошее
A64m
порядок аргументов в функциях и т.д.
Vladislav
порядка аргументов в функции быть не должно, должны быть именованные параметры
Ilya
Небось вот эти самые новые модули так сделать позволят
Про которые тут вчера рассказывали, backpack или как там
Vladimir
Особенно с полиморфизмом, когда у одной функции может быть разное их число.
Vladislav
а имена у них какие?
в идеальном мире? UUID-ы, которые превращаются в имена в IDE по локали пользователя
Vladislav
точно пора уходить, пока меня не побили за такое
A64m
в каждом следующем ответе @int_index удвивает абсурность
Vladislav
я только начал
Ilya
нет
Мы можем понаделать орфан инстансов моноида для Int, и делать import Data.Monoid.Int.Sum? Вроде как да. В этом значит не могут помочь новые модули?
Ilya
Это просто то что хотел @kana_sama, кажется
A64m
инстансы-то не модульны
Vladislav
Такой подход не сработает, если нужно более одного класса так выбрать
кана
ну возможно не в таком виде, это сразу на весь файл скоуп вешает
Ilya
инстансы-то не модульны
Сорри что влез с ними тогда:)
Vladislav
Ньютайпы композятся, я могу написать Sum (Foo Integer), где Foo выберет какой-нибудь другой класс
Vladislav
И в принципе если у меня констрейнт (A x, B x, C x), я могу написать AInst (BInst (CInst x))
A64m
ну возможно не в таком виде, это сразу на весь файл скоуп вешает
ну в таком виде как в пакете рефлекшен можно, для него бы поддержка была получше от компилятора
A64m
слишком много распаковочного бойлерплейта
Vladislav
один coerce что ли?
A64m
сделали бы для этого полегковеснее что-то
Vladislav
согласен
A64m
один coerce что ли?
еще аннотировать типы придется во многих случаях
A64m
вообще надо еще много чего придумать и сделать облегчающего работу с ньютайпами
A64m
но каким бы удобным не сделали выбор инстансов с помощью ньютайпов - все равно должны быть инстанс по умолчанию для любого типа, потому что отсутствие инстанса - проблема сама по себе - это значит кто кто-то будет писать сироты
кана
вообще мы отошли от темы
кана
если текущие идеи утопичны, то идея, что Default => Monoid - плохая идея, реальна
eahqzsr
Не более плохая чем Applicative => Monad
eahqzsr
Там скорее должно быть Default, Magma => Monoid
eahqzsr
Даже не магма а другой тип с ассоциативной операцией который тоже магма
кана
да вот я сделал 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
кана
какая тут связь дефолта с моноидом вообще
кана
и дефолтное значение хочу C
кана
но нейтральным элементом это не будет
кана
понятия нейтральности и дефолта вообще не совместимы
кана
дефолтное значение PATH например пусть будет "/bin", но нейтральный для путей относительно композиции - "./" какой-нибудь
A64m
моя позиция по осмысленности дефолтного значения такая: оно имеет смысл в сочетании с операцией либо как технически детали реализации "сплющивания структур", всяких стораблов и анбоксингов