
Alexander
28.07.2017
19:29:04
..как хорошо что это интернет и здесь не понять когда люди серьёзны, а когда троллят

Yurii
28.07.2017
19:32:05
начинать обучение с теории категорий
ну, для начала надо учителям объяснить (а при учёте, что в пед.институты идут тее, кто никуда более не поступил....)
+ мировосприятие детей в 5,6,7..11 лет разное (психология, педагогика, простигосподи)

Андрей
28.07.2017
19:37:58
По сабжу рекомендю статьи академика Арнольда и его полемику с Бурбакистами. Для затравки - байка от него, якобы реальная. Во французской начальной школе одного первоклассника спросили - сколько будет 3+2. Он ответил - не знаю, но будет столько же, сколько 2+3, потому что сложение коммутативно (С)

Google

Alexander
28.07.2017
20:10:36
Добрый вечер, хотел спросить.
data T a = A a | B a deriving Eq
Class TT (T a) ...

Vasiliy
28.07.2017
20:11:20
я полностью согласен, что конкретные примеры нужны, но ведь для многих вещей есть вполне конкретные примеры
например, моноид, можно на примере строк объяснить

Alexander
28.07.2017
20:12:05
Instance TT (T a) where eq x y = x==y

Denis
28.07.2017
20:12:09
а свободный на примере списка

Vasiliy
28.07.2017
20:12:14
или, скажем, жд состав - прицепили вагоны справа, прицепили слева

Alexander
28.07.2017
20:12:44
Вопрос: зачем он требует ограничить a в инстанс по Eq ?
Ведь у T есть deriving Eq и он нормально сравнивается

Vasiliy
28.07.2017
20:13:44
обратный элемент: добавили в стакан с водой кипятка, вода стала горячее, налили столько же холодной воды, температура такая же, как прежде

Alexander
28.07.2017
20:19:04

Google

Alexander
28.07.2017
20:20:09
Но кажется я слона пропустил , в классе я описал через ::a->a->Bool, а надо было ::(T a)->(T a)->Bool

Андрей
28.07.2017
20:20:56
Имхо хорошо бы определиться - или дерайвинг, или инстанс

Vasiliy
28.07.2017
20:20:57
> data T a = A a | B a deriving Eq
> data R = R
> A R == A R
<interactive>:24:1: error:
• No instance for (Eq R) arising from a use of ‘==’

Alexander
28.07.2017
20:21:58
Дерайвинг для Eq, а инстанс для eq - функции. Но по-любому спасибо, сейчас проверю.

Андрей
28.07.2017
20:23:52
твоя eq = (==) или совсем по-другому можешь ее определить - хозяим барин. Хоть eq _ _ = True

Vasiliy
28.07.2017
20:25:54
data T a = T a deriving Eq = instance Eq a => Eq (T a) where ...

Denis
28.07.2017
20:36:49
ахаа

Alexander
28.07.2017
20:36:50
Не, извиняюсь, не заработало и я не понял.

Denis
28.07.2017
20:37:04
время веселых снимков экрана)

Евгений
28.07.2017
20:39:11
Сделай в тайпклассе TT тип eq :: a -> a -> Bool

Alexander
28.07.2017
20:39:23

Евгений
28.07.2017
20:39:27
У тебя нету телеграма на компе?

Alexander
28.07.2017
20:39:56
К сожалению нет, на рабочем.
Но на последней картинке видно норм надеюсь :) сорян конечно.

Artyom
28.07.2017
20:40:41

Alexander
28.07.2017
20:40:49
С работы нельзя.

Artyom
28.07.2017
20:40:57
а, понятно

Alexander
28.07.2017
20:41:31
Смотрите, eq тип описан
И он T a, у T есть Eq и он норм работает если просто == сравнить.

Google

Alexander
28.07.2017
20:42:23
Зачем он требует ещё ограничить внутренний параметр T ?

Евгений
28.07.2017
20:42:32
А в инстансе
eq (A x) (A y) = x == y
eq (A _) (B _) = False
...

Alexander
28.07.2017
20:42:59
Не хочу

Евгений
28.07.2017
20:43:56
Честно говоря мне не оч понятно чего ты хочешь :)

Denis
28.07.2017
20:44:33

Alexander
28.07.2017
20:44:41
Ок, описал как вы написали, тоже самое: с Eq a => работает, а без - нет

Artyom
28.07.2017
20:45:13
> у T есть Eq
попробуй сделай A id == A not в репле

Андрей
28.07.2017
20:45:35
Страннота какая-то в чате (С) Александр Вершилов

Евгений
28.07.2017
20:45:38
А как ты хочешь чтобы без Eq a сравнивать их?
Внезапно есть типы которые нельзя сравнить

Alexander
28.07.2017
20:47:43
Ну смотрите, может тут и загвоздка. r = (A 1) == (A 2) работает же.
Только за счёт deriving

Artyom
28.07.2017
20:48:18
работает, потому что и у T, и у Integer есть инстанс Eq
притом инстанс Eq (T a) – задерайвленный! – требует инстанс Eq a
что довольно логично

Андрей
28.07.2017
20:49:44
мне кажется, я понял затруднение ТС :) твой тип - однопараметрический, и нет НИКАКИХ ограничений на то, что сувать туда. И никакой дерайвинг еку или орд не ограничивает тебя - ты можешь засунуть все равно то что не екушится и не ордится. Вот для этого и ограничения в инстансах даже при дерайвинге.

Alexander
28.07.2017
20:50:39

Андрей
28.07.2017
20:50:52
То есть в одном месте кода ты можешь засунуть туда числа - и сравнивать свой тип. А в другом месте того же кода - засунуть в тот же тип функции - и ничего не поломается, даже будет работать (инстансы функтора и т.п.)
но екушиться уже не будет

Google

Alexander
28.07.2017
20:51:26
Те он смотрит на конечный тип и для T Integer решает что == это ок из deriving
Но в instance он не смотрит на то, что потом это тоже T Integer?

Андрей
28.07.2017
20:52:27
Ты можешь засунуть T (T (T Int)) и это волшебнорекурсивно отъекушится

Alexander
28.07.2017
20:53:47
Но только для == , а не для моего класса
Такие и были подозрения, но какой-то осадочек пока не понятный :)

Андрей
28.07.2017
20:55:21
потому что судя по словам у тебя каша в голове и терминах

Alexander
28.07.2017
20:55:49
На deriving надейся, а сам не плошай.
Пойду попробую понять когда deriving Eq не будет срабатывать.
Хотя в целом в данной ситуации вроде все понятно, но просто не понятно как оно работает.
Я думал deriving гарантирует Eq

Denis
28.07.2017
20:57:38
ну ты вроде можешь еще StandaloneDeriving

Андрей
28.07.2017
20:58:03
читай выше про НИКАКИХ )

Denis
28.07.2017
20:58:17
deriving instance Eq a => Eq (T a)

Alexander
28.07.2017
20:59:14
В том плане что сам написать инстанс Eq ? Это ясно вроде.
Понятно что не понятно как срабатывает deriving, вроде без него картина относительно светлая.

Андрей
28.07.2017
21:03:41
можешь считать что дерайвинг работает как макрос, пишущий лобовые инстансы как если бы ты писал их сам

Alexander
28.07.2017
21:03:54
deriving Eq, это значит делается инстанс Eq a
И тут, получается, тоже не хватает ограничителя.

Vasiliy
28.07.2017
21:04:48
делается, если есть такая возможность

Андрей
28.07.2017
21:05:18
не еку а а еку твоего типа

Google

Alexander
28.07.2017
21:05:33

Андрей
28.07.2017
21:05:46
а еку а не делается а предполагается

Vasiliy
28.07.2017
21:06:01
для любого a сделать Eq (T a) он не сможет
мог бы, конечно - (==) _ _ = False, например, но здравый смысл подсказывает так не делать


Artyom
28.07.2017
21:07:47
Понятно что не понятно как срабатывает deriving, вроде без него картина относительно светлая.
можешь взять да посмотреть, какие инстансы получаются при deriving Eq
я взял твой код и скомпилил его с флагом -ddump-deriv, вот что получилось
[yom@shiny tmp]$ ghc -ddump-deriv eq.hs
[1 of 1] Compiling Main ( eq.hs, eq.o )
==================== Derived instances ====================
Derived instances:
instance GHC.Classes.Eq a_a1u2 =>
GHC.Classes.Eq (Main.T a_a1u2) where
(GHC.Classes.==) (Main.A a1_a1u3) (Main.A b1_a1u4)
= ((a1_a1u3 GHC.Classes.== b1_a1u4))
(GHC.Classes.==) (Main.B a1_a1u5) (Main.B b1_a1u6)
= ((a1_a1u5 GHC.Classes.== b1_a1u6))
(GHC.Classes.==) _ _ = GHC.Types.False
(GHC.Classes./=) a_a1u7 b_a1u8
= GHC.Classes.not ((GHC.Classes.==) a_a1u7 b_a1u8)
а если убрать мусор, то вот так выглядит
instance Eq a => Eq (T a) where
(==) (A a) (A b) = (a == b)
(==) (B a) (B b) = (a == b)
(==) _ _ = False
(/=) a b = not ((==) a b)
заметь Eq a слева от =>


illiatshurotshka❄️
28.07.2017
21:08:43
я чет запутался с функторами в теории категорий
они же получается отличаются от того что есть в хаскеле

Denis
28.07.2017
21:09:25

Vasiliy
28.07.2017
21:10:14

Denis
28.07.2017
21:10:24
ну это понятно

illiatshurotshka❄️
28.07.2017
21:11:29
Functor f => (a -> b) -> f a -> f b
а и б это категории
что тогда f?

Андрей
28.07.2017
21:13:41
с законом
в Хаскеле - с законом, в ТК - с двумя ?

Vasiliy
28.07.2017
21:13:55
гм.. а какой второй?
f :: * -> *

Denis
28.07.2017
21:15:42
Кметт когда-то написал https://www.schoolofhaskell.com/user/edwardk/snippets/fmap

Андрей
28.07.2017
21:16:45
гм.. а какой второй?
фигасе, приплыли. композиция мапов равна мапу композиции. Да, на эту статью Кметта я и намекаю )