Size: a a a

2021 June 08

MK

Maxim Koltsov in Haskell
опять я всё перепутал
источник

А⚙

Антон ⚙️ in Haskell
опять ты всё перепутал
источник

к

кана in Haskell
тогда бы пришлось например при использовании MonadReader в функциях еще Monad запрашивать)
источник

к

кана in Haskell
ну, в общем выглядит как недоработка ghc, что он не пытается искать нужные зависимости для инстансов в других номинальных зависимостях (при этом в функциях он это делает)
источник

AS

Anton Sorokin in Haskell
Вот вот. Заведу завтра иссуй. Через Dict-ы кстати наверное можно костыльнуть как раз
источник

к

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

к

кана in Haskell
можно еще через unsafeCoercе свой инстанс заделать и в скоуп кода передать
источник

B

Bodigrim in Haskell
Это побочный эффект UndecidableInstances: поскольку мы отложили вычисление цепочки инстансов до рантайма, то и бонусов от него не получим. Если убрать необходимость в UndecidableInstances, то снова работает, например,


module Smth where

class Eq a => X a
class Eq c => Y c
instance X a => Y [a]
источник

AS

Anton Sorokin in Haskell
Ага, только (что забавно) там должно лежать что то не совсем рандомное даже для доказательства a ~ b
источник

AS

Anton Sorokin in Haskell
Эм. До рантайма? Казалось бы, если например циклится - сразу говорит
источник

AS

Anton Sorokin in Haskell
Ну и если инстанса нет - тоже
источник

AS

Anton Sorokin in Haskell
Или это "рантайм компилятора" какой то?
источник

к

кана in Haskell
а, вот оно что
источник

AS

Anton Sorokin in Haskell
Но так то пример интересный, спасибо
источник

B

Bodigrim in Haskell
Как это говорит? В том-то и фишка UndecidableInstances, что компилятор не будет проверять тотальность и позволит писать штуки вроде

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}

module Smth where

class Eq a => X a
class Eq c => Y c
instance (Eq a, X a) => Y a
instance (Eq a, Y a) => X a
источник

AS

Anton Sorokin in Haskell
В функциях говорит
источник

к

кана in Haskell
$p1X :: forall a. X a => Eq a
$p1X = \(@a) ($x :: X a) ->
 case $x of $x { X eq _ -> eq }

x :: forall a. X a => a
x = \(@a) ($x :: X a) ->
 case $x of $x { X _ x -> x }

$cp1Y_r1R2 :: forall a. X a => Eq [a]
$cp1Y_r1R2 = \(@a) ($x :: X a) ->
 GHC.Classes.$fEq[] @a ($p1X @a $x)

$cy_r1Q8 :: forall a. X a => [a]
$cy_r1Q8 = \(@a) ($x :: X a) ->
 : @a (x @a $x) ([] @a)

$fY[] :: forall a. X a => Y [a]
$fY[] = \(@a) ($x :: X a) ->
 Y @[a] ($cp1Y_r1R2 @a $x) ($cy_r1Q8 @a $x)

действительно, без undecidable он вытаскивает eq из x
источник

AS

Anton Sorokin in Haskell
А, не говорит. Извиняюсь. Правда несуществующие инстансы и циклящиеся функции
источник

AS

Anton Sorokin in Haskell
Теперь страшно с этим жить
источник

AS

Anton Sorokin in Haskell
Мне почему то казалось, что он условно 200 редукций инстанса делает на компайл тайме, и если не получает - просит увеличить их количество
источник