Size: a a a

2021 May 03

JS

Jerzy Syrowiecki in Haskell
не комильфо
источник

JS

Jerzy Syrowiecki in Haskell
ну вот в теории-то там переменная tag может населяться только Tag1 и Tag2. как это выразить в коде?
источник

к

кана in Haskell
в теории как раз в tag может быть не только Tag1 и Tag2, про что и речь
источник

IO

I O in Haskell
Можно свести все это к одному классу, типа

class KnownTag (t :: Tag) where
 stag :: (t ~ 'Tag1 => r) -> (t ~ 'Tag2 => r) -> r

instance KnownTag 'Tag1 where
 stag f _ = f

instance KnownTag 'Tag2 where
 stag _ f = f


И дальше писать

deriveAlpha :: forall t . KnownTag t => Dict (Alpha t)
deriveAlpha = stag @t Dict Dict


Но совсем от констрейнтов IIRC не избавиться
источник

к

кана in Haskell
data family Tag3 :: k

x :: Foo Tag3
fun x

инстансов для Alfa, Bravo для Tag3 нет, че делать не ясно
источник

IO

I O in Haskell
Удобнее конечно

deriveAlpha :: forall t r . KnownTag t => (Alpha t => r) -> r
deriveAlpha f = stag @t f f


но идея понятна
источник

к

кана in Haskell
можно еще вместо класс сделать экзист
источник

к

кана in Haskell
data SomeFoo = forall tag. Alfa tag => SomeFoo (Foo tag)

fun :: SomeFoo -> Bar
fun (SomeFoo foo) = baz (qux foo)

foo1 :: Foo Tag1
foo2 :: Foo Tag2

fun (SomeFoo foo1)
fun (SomeFoo foo2)
источник

к

кана in Haskell
это по сути как и KnownTag выше, только вместого кастомного элиминатора используется дефолтный хаскельный при патмаче SomeFoo
источник

Y

Yuuri in Haskell
Жуть 😵 А если третий тег появится?
источник

JS

Jerzy Syrowiecki in Haskell
не в Хаскеле, а в моей теории только эти два. теперь надо это выразить в Хаскеле, самом выразительном языке на свете
источник

Y

Yuuri in Haskell
Что, типы не натягиваются?
источник

JS

Jerzy Syrowiecki in Haskell
свести к одному тривиальному констрэйнту — мне нравится, спасибо
источник

a

adam in Haskell
как в хаддоке вот так вот экранировать?
источник

Y

Yuuri in Haskell
А нет ли closed type family, или как их?
источник

JS

Jerzy Syrowiecki in Haskell
вот их сейчас на самом деле 5 и на подходе шестой
источник

JS

Jerzy Syrowiecki in Haskell
@\@since@, наверно
источник

к

кана in Haskell
ну тогда у тебя в варианте с KnownTag будет 6 кейсов
источник

к

кана in Haskell
вместо одного с SomeFoo
источник

к

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