Andrei
Лишнего написано. Вычитание через сумму и негейт делается.
Alexander
это во первых, во вторых
Cheese
Alexander
instance Num b=> Num (Pair a b) where
Ilya
Ilya
не спорю
Alexander
instance Num a => Num (Pair a b) where
Andrei
Лучше минус убрать.
Alexander
ничуть не хуже
Alexander
я не понимею почему не они должны автоматом дерайвиться
Cheese
instance Num a => Num (Pair a b) where
а вот этого хороший довод. позволь, я сформулирую его за тебя: тривиальное поведение не единственно. нет согласия о том, какое именно тривиальное поведение выбрать по умолчанию
Alexander
нет, с бин операциями проблем нету
Alexander
а вот с fromInteger есть
Alexander
там неоткуда взять значение
Cheese
ха, действительно, ты не напишешь instance Num a => Num (Pair a b)
Cheese
а instance (Num a, Num b) => Num (Pair a b) напишешь
Ilya
хорошо, fromInteger действительно немного выбивается
Cheese
так что попробуй придумать другой тривиальный инстанс
Cheese
@qnikst ^
Ilya
но всё же не вижу проблемы в fromInteger x = Pair (fromInteger x) (fromInteger x)
Cheese
Cheese
deriveNumRecursive ''Pair
Ilya
короче вопрос остался открытым:)
Ilya
между прочим
Ilya
для кортежей дерайвнуто Ord
Ilya
лексикографически
Ilya
слева направо
Ilya
хотя это не единственный способо задерайвить Ord для кортежей
Ilya
так что, даже наличие других тривиальных инстансов не мешает GHC пользовать deriving
Cheese
Cheese
почему это до сих пор не сделано?
Ilya
какой вопрос?
почему в GHC не сделан deriving Num для произведения двух типов, или для кортежей из двух типов
Ilya
ну для кортежей сделано, но в отдельном пакете
Cheese
потому что никому кроме тебя это не было нужно
Cheese
Ord для кортежей нужен почти каждому почти каждый день
Ilya
хрень не неси
Ilya
Data.NumInstances.Tuple
Cheese
ну вот, сделай свой тип нютайпом вокруг кортежа
Ilya
и ещё расширение для newtype понадобится %)
Ilya
я ж не говорю, что нельзя
Ilya
просто твои утверждения пересолены категоричностью
Cheese
ещё один контрдовод — Num создавался как костыль, чтобы писать одинаковый (+) для разных чисел. а если мы будем всякие штуки, не очень являющиеся числами, класть в Num, это может повлечь какие-нибудь странные ошибки.
Misha
или что угодно еще
Ilya
>никому кроме тебя не было нужно
>почти каждому нужно почти каждый день
Cheese
слово "почти" убирает категоричность
Ilya
Ilya
откуда вы вообще взяли, что deriving должен быть только в случае единственно возможного способа это сделать
Cheese
ок, скажу помягче. очень похоже на то, что никто до тебя не нашёл в себе силы внести такое поведение в Хаскелл
Ilya
как бы многие deriving выбирают одну из множества возможностей
Misha
потому что least surprise
Ilya
которую разрабы GHC нашли самой частоисполльзуемй
Misha
для кортежей это интуитивно, для Num - миллион нюансов, начиная от "что делать" и до различного поведения ошибок округления
Misha
ну вот да
Ilya
я бы ожидал одинакового дерайвинга Num для кортежей из двух элементов и для трех
Ilya
и мой способ работает для любого числа элементов в кортеже
Cheese
кстати, добавь заодно аналогичные инстансы для Моноида и Полугруппы. когда я пишу руками эти инстансы, они всегда получаются как (<>) по всем полям
Ilya
а комплексные числа - только для кортежей из двух эл-тов
Misha
это математически ужасное решение совершенно
Misha
а для четырех кватернионы выводить или векторы?
Ilya
боже мой
Ilya
векторы конечно
Ilya
потому что для любого N
Misha
ну фиг знает, где-то здесь у разработчиков прошла линия за которой они решили, что ну его нафиг, пусть руками пишут
Misha
ну и есть же Generic
Misha
выводи-не-хочу
Cheese
в общем, главный ответ на вопрос "почему что-то не сделано?" — это "потому что никто до сих пор не сделал"
Cheese
когда отправишь письмо в рассылку ghc-dev или патч в GHC, узнаешь, чему на самом деле это мешает. или нет
Vladislav
Ну кстати да, через генерики такое можно вывести.
Ilya
For pairs, I like fromInteger n = (fromInteger n, fromInteger n). Then, for
instance, 1 * (a,b) = (a,b).
Ilya
из рассылки
Ilya
варианты с нулями так уже не смогут
Ilya
Ilya
уже обсудили
Cheese
и на чём порешили?
Cheese
нет, с кортежами не интересно, это можно просто в библиотеку положить