Size: a a a

2020 May 28

AA

A64m AL256m qn<co... in Haskell
Алексей Худяков
Henning Thielemann, ещё один беспокоится о совместимости с Haskell2010
ну вот я про него и говорил, когда кроме одного
источник

AV

Alexander Vershilov in Haskell
а мейер?
источник

AA

A64m AL256m qn<co... in Haskell
мейер 7.4 тоже не пользуется
источник

YS

Yan Shkurinskiy in Haskell
Вопрос про GADTs - каково практическое применение того, что конструкторы могут возвращать разный тип? Я вот прочитал пример про type witness, как ещë можно использовать?
источник

Y

Yuuri in Haskell
Вроде канонiческий пример - well-typed интерпретатор
источник

YS

Yan Shkurinskiy in Haskell
Yuuri
Вроде канонiческий пример - well-typed интерпретатор
Можно поподробнее?
источник

YS

Yan Shkurinskiy in Haskell
Пока вроде нашел пару пейперов, где они упоминаются, вроде понял зачем оно
источник

Y

Yuuri in Haskell
Это когда мы делаем AST вместо
data Expr = Int Int | Bool Bool | Add Expr Expr | If Expr Expr Expr

в виде
data Expr a where
 Int :: Int -> Expr Int
 Bool :: Bool -> Expr Bool
 Add :: Expr Int -> Expr Int -> Expr Int
 If :: Expr Bool -> Expr a -> Expr a

чтобы в рантайме не проверять сложение инта с булём.
источник

YS

Yan Shkurinskiy in Haskell
Ну это да
источник

YS

Yan Shkurinskiy in Haskell
В общем, как я понял, конструкторы содержат инфу о типе, и, матчась по конструкторам, мы, грубо говоря, можем в каком-то смысле матчиться по типам
источник

к

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

к

кана in Haskell
data T a where
 TBool :: Bool -> T Int
 TInt :: Int -> T Bool

f :: T a -> a
f (TBool True) = 1
f (TBool False) = 0
f (TInt x) = x == 0
источник

к

кана in Haskell
~~~

data T a
 = TBool {a ~ Int} Bool
 | TInt {a ~ Bool} Int

coe :: a -> a ~ b -> b
sym :: a ~ b -> b ~ a

f :: T a -> a
f (TBool {p :: a ~ Int} True) =
 (coe (sym p) (1 :: Int)) :: a
f (TBool {p :: a ~ Int} False) =
 (coe (sym p) (0 :: Int)) :: a
f (TInt {p :: a ~ Bool} (x :: Int)) =
 (coe (sym p) ((x == 0) :: Bool)) :: a
источник

к

кана in Haskell
я считаю что это хороший пример, чтобы сразу не было ложной интуиции, что тип в гадте как-то завязан на тип содержимого, а то у меня так и было
источник

YS

Yan Shkurinskiy in Haskell
Спасибо! Попробую прочитать...
источник

YS

Yan Shkurinskiy in Haskell
С coe и sym сложно -.-
источник

YS

Yan Shkurinskiy in Haskell
Почему только сигнатуры?
источник

YS

Yan Shkurinskiy in Haskell
Т.е. GADTs выражаются через дататайпы с констрейнтом на равенство типов?
источник

к

кана in Haskell
Yan Shkurinskiy
Почему только сигнатуры?
потому что они не определены, но есть в контексте.
Да, GADT-ы выражены через равенства типов
coe просто кастит значение одного типа к другому, если они равны, а sym переворачивает пруф

вместо coe на самом деле cast, я перепутал
источник

к

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