
Ilya
01.09.2017
12:47:59
короче
я утверждаю

Yuriy
01.09.2017
12:48:09

Alexander
01.09.2017
12:48:16
Num

Google

Yuriy
01.09.2017
12:48:26
Num никак не дерайвится

Ilya
01.09.2017
12:48:27
что это единственный возможный способ задерайвить Num для произведения двух полиморфных типов
data Pair a b = Pair a b deriving Show
instance (Num a, Num b) => Num (Pair a b) where
Pair a b + Pair a' b' = Pair (a + a') (b + b')
Pair a b - Pair a' b' = Pair (a - a') (b - b')
Pair a b * Pair a' b' = Pair (a * a') (b * b')
negate (Pair a b) = Pair (negate a) (negate b)
abs (Pair a b) = Pair (abs a) (abs b)
fromInteger x = Pair (fromInteger x) (fromInteger x)
signum (Pair a b) = Pair (signum a) (signum b)
ессли я не прав, то ткните

Alexander
01.09.2017
12:48:52
а. он не тайпчекается
б. нет, возможно поведение как у комплексных чисел

Vasiliy
01.09.2017
12:49:19
deriving должен не только для произведений работать

Alexander
01.09.2017
12:49:19
а стоп, я наркоман

Ilya
01.09.2017
12:49:30
что не тайпчекается?

Alexander
01.09.2017
12:49:31
тайпчекается
но поведение как у комплексных чисел может хотеться

Yuriy
01.09.2017
12:50:08

Andrei
01.09.2017
12:50:11
Лишнего написано. Вычитание через сумму и негейт делается.

Google

Alexander
01.09.2017
12:50:35
это во первых, во вторых

Yuriy
01.09.2017
12:50:38

Alexander
01.09.2017
12:50:46
instance Num b=> Num (Pair a b) where

Ilya
01.09.2017
12:50:47
не спорю

Alexander
01.09.2017
12:50:58
instance Num a => Num (Pair a b) where

Andrei
01.09.2017
12:51:00
Лучше минус убрать.

Alexander
01.09.2017
12:51:03
ничуть не хуже
я не понимею почему не они должны автоматом дерайвиться

Ilya
01.09.2017
12:52:12

Yuriy
01.09.2017
12:52:32
instance Num a => Num (Pair a b) where
а вот этого хороший довод. позволь, я сформулирую его за тебя: тривиальное поведение не единственно. нет согласия о том, какое именно тривиальное поведение выбрать по умолчанию

Alexander
01.09.2017
12:52:38
нет, с бин операциями проблем нету
а вот с fromInteger есть
там неоткуда взять значение

Yuriy
01.09.2017
12:53:38
ха, действительно, ты не напишешь instance Num a => Num (Pair a b)
а instance (Num a, Num b) => Num (Pair a b) напишешь

Ilya
01.09.2017
12:55:32
хорошо, fromInteger действительно немного выбивается

Yuriy
01.09.2017
12:55:43
так что попробуй придумать другой тривиальный инстанс
@qnikst ^

Ilya
01.09.2017
12:56:21
но всё же не вижу проблемы в fromInteger x = Pair (fromInteger x) (fromInteger x)

Google

Yuriy
01.09.2017
12:57:25
deriveNumRecursive ''Pair

Ilya
01.09.2017
13:04:14
короче вопрос остался открытым:)
между прочим
для кортежей дерайвнуто Ord
лексикографически
слева направо
хотя это не единственный способо задерайвить Ord для кортежей
так что, даже наличие других тривиальных инстансов не мешает GHC пользовать deriving

Yuriy
01.09.2017
13:08:44
почему это до сих пор не сделано?

Ilya
01.09.2017
13:09:48
какой вопрос?
почему в GHC не сделан deriving Num для произведения двух типов, или для кортежей из двух типов
ну для кортежей сделано, но в отдельном пакете

Yuriy
01.09.2017
13:10:02
потому что никому кроме тебя это не было нужно
Ord для кортежей нужен почти каждому почти каждый день

Ilya
01.09.2017
13:10:51
хрень не неси
Data.NumInstances.Tuple

Yuriy
01.09.2017
13:11:28
ну вот, сделай свой тип нютайпом вокруг кортежа

Ilya
01.09.2017
13:12:48
и ещё расширение для newtype понадобится %)

Google

Ilya
01.09.2017
13:12:54
я ж не говорю, что нельзя
просто твои утверждения пересолены категоричностью

Yuriy
01.09.2017
13:13:11
ещё один контрдовод — Num создавался как костыль, чтобы писать одинаковый (+) для разных чисел. а если мы будем всякие штуки, не очень являющиеся числами, класть в Num, это может повлечь какие-нибудь странные ошибки.

Misha
01.09.2017
13:13:16
или что угодно еще

Ilya
01.09.2017
13:13:29
>никому кроме тебя не было нужно
>почти каждому нужно почти каждый день

Yuriy
01.09.2017
13:13:56
слово "почти" убирает категоричность

Ilya
01.09.2017
13:14:14
откуда вы вообще взяли, что deriving должен быть только в случае единственно возможного способа это сделать

Yuriy
01.09.2017
13:15:55
ок, скажу помягче. очень похоже на то, что никто до тебя не нашёл в себе силы внести такое поведение в Хаскелл

Ilya
01.09.2017
13:16:07
как бы многие deriving выбирают одну из множества возможностей

Misha
01.09.2017
13:16:09
потому что least surprise

Ilya
01.09.2017
13:16:18
которую разрабы GHC нашли самой частоисполльзуемй

Misha
01.09.2017
13:16:51
для кортежей это интуитивно, для Num - миллион нюансов, начиная от "что делать" и до различного поведения ошибок округления

Ilya
01.09.2017
13:16:58

Misha
01.09.2017
13:17:08
ну вот да

Ilya
01.09.2017
13:17:14
я бы ожидал одинакового дерайвинга Num для кортежей из двух элементов и для трех
и мой способ работает для любого числа элементов в кортеже

Yuriy
01.09.2017
13:17:26
кстати, добавь заодно аналогичные инстансы для Моноида и Полугруппы. когда я пишу руками эти инстансы, они всегда получаются как (<>) по всем полям

Ilya
01.09.2017
13:17:30
а комплексные числа - только для кортежей из двух эл-тов

Google

Misha
01.09.2017
13:17:48
это математически ужасное решение совершенно
а для четырех кватернионы выводить или векторы?

Ilya
01.09.2017
13:18:14
боже мой
векторы конечно
потому что для любого N

Misha
01.09.2017
13:19:03
ну фиг знает, где-то здесь у разработчиков прошла линия за которой они решили, что ну его нафиг, пусть руками пишут
ну и есть же Generic
выводи-не-хочу

Yuriy
01.09.2017
13:19:39
в общем, главный ответ на вопрос "почему что-то не сделано?" — это "потому что никто до сих пор не сделал"
когда отправишь письмо в рассылку ghc-dev или патч в GHC, узнаешь, чему на самом деле это мешает. или нет

Index
01.09.2017
13:20:38
Ну кстати да, через генерики такое можно вывести.

Ilya
01.09.2017
13:21:21
For pairs, I like fromInteger n = (fromInteger n, fromInteger n). Then, for
instance, 1 * (a,b) = (a,b).
из рассылки
варианты с нулями так уже не смогут
уже обсудили

Yuriy
01.09.2017
13:23:10
и на чём порешили?
нет, с кортежами не интересно, это можно просто в библиотеку положить
речь-то про дерайвинг для произвольного произведения

Ilya
01.09.2017
13:25:28
ну можно обойтись кортежами и {-# LANGUAGE GeneralizedNewtypeDeriving #-}