Size: a a a

2020 November 06

к

кана in Haskell
newtype это только компайл тайм штука, чтобы одни и те же значения имели номинально разные типы, чтобы не спутать два числа, coerce это просто id, который игнорирует эти компайтлайм условности
источник

ПК

Паша Калугин... in Haskell
Попробовал написать виселицу. Можно ли как-то упростить?
источник

к

кана in Haskell
Yuki Rito
Вот написал такое грубо говоря -
class X a where x :: String -> Maybe a
newtype Helper a = Helper a
instance X a => SomeClass (Helper a) where ....

data DDD = ....
 deriving SomeClass via (X DDD)

работает как надо. Но задумался, а как оно работает? Ведь методы SomeClass-а работают не с DDD, а с Helper DDD. Но оно как-то из инстанса для Helper DDD выводит инстанс для DDD. То есть он сркыто внизу использует как бы deriving newtype? На нем получается базируется deriving via? А если Helper не newtype, а data? Тогда он как выведет?
так хм

via X DDD это странно
источник

к

кана in Haskell
может там via Helper DDD ?
источник

YR

Yuki Rito in Haskell
кана
newtype это только компайл тайм штука, чтобы одни и те же значения имели номинально разные типы, чтобы не спутать два числа, coerce это просто id, который игнорирует эти компайтлайм условности
эт понятно. Вопрос такой: верно ли 1) без deriving newtype, deriving via работать не смог бы и 2) deriving via может работать только с newtype, но не с data ?
источник

YR

Yuki Rito in Haskell
ой, да, Helper конечно
источник

YR

Yuki Rito in Haskell
то есть deriving via работает coerce-я результаты? Так что ли? А с data такое уже не пройдет?
источник

AA

A64m AL256m qn<co... in Haskell
Yuki Rito
эт понятно. Вопрос такой: верно ли 1) без deriving newtype, deriving via работать не смог бы и 2) deriving via может работать только с newtype, но не с data ?
деривинг ньютайп и деривинг виа используют одну и ту же фичу - коэрс
источник

к

кана in Haskell
1 - неверно, при чем тут deriving newtype, coerce можно и без него сделать
2 - в качества "через что" только newtype, иначе как добиться одинаковой репрезентации
источник

AA

A64m AL256m qn<co... in Haskell
Yuki Rito
то есть deriving via работает coerce-я результаты? Так что ли? А с data такое уже не пройдет?
не результаты а методы класса
источник

YR

Yuki Rito in Haskell
яяяясно.... А я уж думал там глубокая магия прячется :)
источник

YR

Yuki Rito in Haskell
да, методы... угу
источник

к

кана in Haskell
Yuki Rito
то есть deriving via работает coerce-я результаты? Так что ли? А с data такое уже не пройдет?
newtype X = X Int
 deriving newtype Show
 deriving Ord via Helper X

это то же самое что и

data X = X Int

instance Show X where
 show = coerce (show :: Int -> String)

instance Ord X where
 compare = coerce (compare :: Helper X -> Helper X -> Ordering)
источник

YR

Yuki Rito in Haskell
ну скажем там, все для чего есть Coercible a b, так?
источник

YR

Yuki Rito in Haskell
А есть нет, то deriving via использовать нельзя
источник

YR

Yuki Rito in Haskell
да?
источник

к

кана in Haskell
ну я думаю ghc даже не нужно Coercible, он может и сам проверить, одинаковая ли у типов репрезентация
источник

AA

A64m AL256m qn<co... in Haskell
для того, у чего есть коэрсибл оно будет зиро-кост
источник

AA

A64m AL256m qn<co... in Haskell
а так-то можно коэрсить дженерик-репрезентации, есть исо-дерайвинг
источник

AA

A64m AL256m qn<co... in Haskell
кана
ну я думаю ghc даже не нужно Coercible, он может и сам проверить, одинаковая ли у типов репрезентация
ну это одно и то же, коэрсибл не настоящий тайпкласс
источник