Size: a a a

2021 January 16

к

кана in Haskell
Жук Короед
Пытаюсь понять DerivingVia, но что-то непонятное происходит:
data Rad n where
Rad :: (Coercible Double n, RealFloat n)
=> n -> Rad n
deriving RealFloat via Double
GHC жалуется:

* Couldn't match representation of type `Double'
                          with that of `Deg n'
   arising from the coercion of the method `floatRadix'
     from type `Double -> Integer' to type `Deg n -> Integer'
* When deriving the instance for (RealFloat (Deg n))

Почему не совпадает, если я указал, что n и Double Coercible? Только потому, что не newtype, а data?
deriving via работает иначе, он позволяет работать с датами, но не так как выше


newtype Unshowable a = Unshowable a
instance Show (Unshowable a) where
 show _ = "unshowable"

data X = Y
 deriving Show via (Unshowable X)

то есть не важно, data или newtype - таргет для deriving via

важно, чтобы тип слева от deriving via был коерсибл в тип справа от deriving via
источник

к

кана in Haskell
Жук Короед
Ого, не знал, что информация об инстансах лежит в рантайме вместе с данными. Познавательно 👀
в общем случае не лежит, а генерируется при вызове функций дополнительным аргументом, но не в твоем, тут ты явно затребовал, чтобы это было в конструкторе
источник

к

кана in Haskell
то есть смотрим пример

data X a = X a

f :: Show a => X a -> String
f (X a) = show a

тут show появился, потому что его явно затребовали в сигнатуре функции, это неявный аргумент, то есть когда вызовут f, то компилятор сам подставит какой-то инстанс (набор функций, где show - одна из них)

а вот твой тип

data X a = Show a => X a
(по сути
data X a = X {Show a} a
}

f :: X a -> String
f (X a) = show a

вот тут Show инстанс явно не затребован f, что это за инстанс компилятору не было бы известно (ну на самом деле в этом примере очень дажно можно), НО он лежит прямо внутри X, и поэтому он может его использовать
источник

к

кана in Haskell
вот примерный код сгенерированный

class MyShow a where
 myShow :: a -> String
 anotherFunction :: a -> ()

instance MyShow Int where
 myShow x = show x
 anotherFunction x = ()

data X a where
 X :: MyShow a => a -> X a

f :: MyShow a => a -> X a
f x = X x

g :: X a -> String
g (X x) = myShow x

-- Core:

myShow :: MyShow a => a -> String
myShow = \(@a) (inst :: MyShow a) ->
 case inst of inst
   MyShow myShow anotherFunction -> myShow

$fMyShowInt :: MyShow Int
$fMyShowInt =
 MyShow @Int
   (\(x :: Int) -> show @Int GHC.Show.$fShowInt x)
   (\_ -> GHC.Tuple.())

f :: MyShow a => a -> X a
f = \(@a) ($dMyShow_a :: MyShow a) (x :: a) ->
 X @a $dMyShow_a x

g :: X a -> String
g = \(@a) (d :: X a) ->
 case d of
   X $dMyShow_a x -> myShow @a $dMyShow_a x
источник

ЗП

Зигохистоморфный Пре... in Haskell
кана
вот примерный код сгенерированный

class MyShow a where
 myShow :: a -> String
 anotherFunction :: a -> ()

instance MyShow Int where
 myShow x = show x
 anotherFunction x = ()

data X a where
 X :: MyShow a => a -> X a

f :: MyShow a => a -> X a
f x = X x

g :: X a -> String
g (X x) = myShow x

-- Core:

myShow :: MyShow a => a -> String
myShow = \(@a) (inst :: MyShow a) ->
 case inst of inst
   MyShow myShow anotherFunction -> myShow

$fMyShowInt :: MyShow Int
$fMyShowInt =
 MyShow @Int
   (\(x :: Int) -> show @Int GHC.Show.$fShowInt x)
   (\_ -> GHC.Tuple.())

f :: MyShow a => a -> X a
f = \(@a) ($dMyShow_a :: MyShow a) (x :: a) ->
 X @a $dMyShow_a x

g :: X a -> String
g = \(@a) (d :: X a) ->
 case d of
   X $dMyShow_a x -> myShow @a $dMyShow_a x
кстати какие флаги юзать для такой чистоты выхлопа?
источник

к

кана in Haskell
не думаю что есть такие флаги, я вручную вычищаю)
источник

ЗП

Зигохистоморфный Пре... in Haskell
кана
не думаю что есть такие флаги, я вручную вычищаю)
а вдруг?
ладно напиши свою команду, что ты используешь
источник

к

кана in Haskell
да никакой команды, я копирую из репла в редактор, а потом
источник

MK

Maxim Koltsov in Haskell
попробуй -dsuppress-all
источник

MK

Maxim Koltsov in Haskell
много говна уберёт сразу
источник

MK

Maxim Koltsov in Haskell
ещё можно -dsuppress-unique, правда бывает что убирает слишком много
источник

к

кана in Haskell
неплохо, оно выкинуло все сигнатуры и все [], остается только вырезать коментарий и переименовывать переменные
источник

MK

Maxim Koltsov in Haskell
а что такое [sk:1]?
источник

MK

Maxim Koltsov in Haskell
что-то про skolem?
источник

ЗП

Зигохистоморфный Пре... in Haskell
так напишите одну команду со всеми флагами
источник

MK

Maxim Koltsov in Haskell
ghc -fforce-recomp -ddump-simpl -dsuppress-all -dsuppres-uniques Foo.hs
источник

MK

Maxim Koltsov in Haskell
-O0 / -O по желанию
источник

ЗП

Зигохистоморфный Пре... in Haskell
Maxim Koltsov
ghc -fforce-recomp -ddump-simpl -dsuppress-all -dsuppres-uniques Foo.hs
со стеком тоже самое?)
источник

MK

Maxim Koltsov in Haskell
со стеком можно в ghc-options: добавить
источник

MK

Maxim Koltsov in Haskell
в кабал файле
источник