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