Евгений
Внезапно есть типы которые нельзя сравнить
Alexander
Ну смотрите, может тут и загвоздка. r = (A 1) == (A 2) работает же.
Alexander
Только за счёт deriving
Artyom
работает, потому что и у T, и у Integer есть инстанс Eq
Artyom
притом инстанс Eq (T a) – задерайвленный! – требует инстанс Eq a
Artyom
что довольно логично
Andrey
мне кажется, я понял затруднение ТС :) твой тип - однопараметрический, и нет НИКАКИХ ограничений на то, что сувать туда. И никакой дерайвинг еку или орд не ограничивает тебя - ты можешь засунуть все равно то что не екушится и не ордится. Вот для этого и ограничения в инстансах даже при дерайвинге.
Andrey
То есть в одном месте кода ты можешь засунуть туда числа - и сравнивать свой тип. А в другом месте того же кода - засунуть в тот же тип функции - и ничего не поломается, даже будет работать (инстансы функтора и т.п.)
Andrey
но екушиться уже не будет
Alexander
Те он смотрит на конечный тип и для T Integer решает что == это ок из deriving
Alexander
Но в instance он не смотрит на то, что потом это тоже T Integer?
Andrey
Ты можешь засунуть T (T (T Int)) и это волшебнорекурсивно отъекушится
Alexander
Но только для == , а не для моего класса
Alexander
Такие и были подозрения, но какой-то осадочек пока не понятный :)
Andrey
потому что судя по словам у тебя каша в голове и терминах
Alexander
На deriving надейся, а сам не плошай. Пойду попробую понять когда deriving Eq не будет срабатывать.
Alexander
Хотя в целом в данной ситуации вроде все понятно, но просто не понятно как оно работает.
Alexander
Я думал deriving гарантирует Eq
Зигохистоморфный
ну ты вроде можешь еще StandaloneDeriving
Andrey
читай выше про НИКАКИХ )
Зигохистоморфный
deriving instance Eq a => Eq (T a)
Alexander
В том плане что сам написать инстанс Eq ? Это ясно вроде.
Alexander
Понятно что не понятно как срабатывает deriving, вроде без него картина относительно светлая.
Andrey
можешь считать что дерайвинг работает как макрос, пишущий лобовые инстансы как если бы ты писал их сам
Alexander
deriving Eq, это значит делается инстанс Eq a
Alexander
И тут, получается, тоже не хватает ограничителя.
Vasiliy
делается, если есть такая возможность
Andrey
не еку а а еку твоего типа
Andrey
а еку а не делается а предполагается
Vasiliy
для любого a сделать Eq (T a) он не сможет
Vasiliy
мог бы, конечно - (==) _ _ = False, например, но здравый смысл подсказывает так не делать
Artyom
Понятно что не понятно как срабатывает 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 слева от =>
Anonymous
я чет запутался с функторами в теории категорий
Anonymous
они же получается отличаются от того что есть в хаскеле
Зигохистоморфный
я чет запутался с функторами в теории категорий
функторы это морфизмы между категориями
Зигохистоморфный
ну это понятно
Anonymous
Functor f => (a -> b) -> f a -> f b
Anonymous
а и б это категории
Anonymous
что тогда f?
Andrey
с законом
в Хаскеле - с законом, в ТК - с двумя 😊
Vasiliy
гм.. а какой второй?
Vasiliy
что тогда f?
отображение между типами
Vasiliy
f :: * -> *
Зигохистоморфный
в Хаскеле - с законом, в ТК - с двумя 😊
ну из-за паратримитичности не надо 2 проверять)
Зигохистоморфный
Кметт когда-то написал https://www.schoolofhaskell.com/user/edwardk/snippets/fmap
Andrey
гм.. а какой второй?
фигасе, приплыли. композиция мапов равна мапу композиции. Да, на эту статью Кметта я и намекаю )
Anonymous
получается, что это f в теории категорий не нужно
Зигохистоморфный
в чем отличие ExistentialQuantification от RankType?
Vasiliy
ёлыпалы, точно
Vasiliy
вроде как ExisentialQuanticitation выражается через RankNTypes
Anonymous
ну бля, я чет не могу соединить определение функтора в кт и а хаскеле
Andrey
(fmap f) дает морфизм. f параметризует его
Alex
в хаскеле эндофункторы
Vasiliy
ну бля, я чет не могу соединить определение функтора в кт и а хаскеле
функтор отображает категорию в категорию, у категории есть объекты и морфизмы, f отображает объекты в объекты, fmap отображает морфизмы в морфизмы
Зигохистоморфный
Vasiliy
например, Maybe отображает Int в Maybe Int, а fmap отображает even :: Int -> Bool в Maybe Int -> Maybe Bool
Vasiliy
я, возможно, неправильные термины использую, в обычной жизни я на плюсах пишу :D
Зигохистоморфный
Int -> Maybe Int?
Vasiliy
это какая-то монада получается
Vasiliy
> :t fmap @Maybe @Int even fmap @Maybe @Int even :: Maybe Int -> Maybe Bool
Oleg
Int -> Maybe Int?
Maybe - можно рассматривать как преобразование типа
Anonymous
функтор это просто мап из одной категории в другую сохраняя структуру
Зигохистоморфный
ну как бы это переход в другую подкатегорию
Anonymous
тогда многие функции в хаскеле - функторы?
Oleg
функтор это просто мап из одной категории в другую сохраняя структуру
Да, но как уже напоминали, в хачкеле только эндофункторы. Поэтому он сопоставляет Hask у Hask
Anonymous
так стоп
Oleg
Каждому объекту (типу) он сопоставляет другой объект (тип) с помощью конструктора типов * -> *
Andrey
функции функторы в вышеупомянутых плюсах )
Anonymous
тогда f - категория?
кана
f a - категория, не?
Oleg
тогда f - категория?
Нет категория одна - Hask
Anonymous
ааа
Vasiliy
здесь
f - это отображение из объектов одной категории в объекты другой
Anonymous
но зачем нам f