Size: a a a

2020 November 27

MK

Maxim Koltsov in Haskell
Переставляя хендлеры можно оба варианта получить
источник
2020 November 28

AV

Alexander Vershilov in Haskell
почему во wreq responseBody чистый
источник

AV

Alexander Vershilov in Haskell
они там lazy io прячут? нехорошо же?
источник

MK

Maxim Koltsov in Haskell
Он читает всё
источник

MK

Maxim Koltsov in Haskell
Где-то в доке написано
источник

R

Roman in Haskell
я тут узнал, что хаскельные экзистенциальные типы становятся полноценными сигмами (зависимыми туплами), если их запромоутить на тайп-левел
источник

MK

Maxim Koltsov in Haskell
Так же как сам хттп клиент
источник

MK

Maxim Koltsov in Haskell
Roman
я тут узнал, что хаскельные экзистенциальные типы становятся полноценными сигмами (зависимыми туплами), если их запромоутить на тайп-левел
Покажи
источник

к

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

к

кана in Haskell
это должно быть и проще сделать
источник

R

Roman in Haskell
к примеру, имея

data Some f = forall a. Some (f a)
data TyNameRep (kind :: GHC.Type) = TyNameRep Symbol Nat


можно написать такое:

class KnownPolytype (binds :: [Some TyNameRep]) term args res a | args res -> a, a -> res where
   knownPolytype :: Proxy binds -> TypeScheme term args res

instance (KnownSymbol name, KnownNat uniq, KnownKind kind, KnownPolytype binds term args res a) =>
           KnownPolytype ('Some ('TyNameRep @kind name uniq) ': binds) term args res a where
   knownPolytype _ = TypeSchemeAll @name @uniq @kind Proxy $ \_ -> knownPolytype (Proxy @binds)


KnownPolytype по сути определен "рекурсией" по первому аргументу типа [Some TyNameRep], где Some экзистенциально упаковывает кайнд. Так вот в инстансе мы матчим по 'Some и хаскель позволяет достать kind через тайп-левельный тайп-апликейшон и даже позволяет сделать по этому kind констрейт KnownKind (кастомный класс, не из бейз). То есть мы сначала упаковали в экзистенциальный тип, а потом распаковали и используем экзистенциальную переменную в вычислениях. На уровне значений пришлось бы упаковывать переменную вместе с констрейнтом, иначе когда ее оттуда достаешь, все информация потеряна и ничего о переменной уже сказать нельзя

Ну может это и не прям полноценные сигмы, но где-то близко.
источник

к

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

MK

Maxim Koltsov in Haskell
Roman
к примеру, имея

data Some f = forall a. Some (f a)
data TyNameRep (kind :: GHC.Type) = TyNameRep Symbol Nat


можно написать такое:

class KnownPolytype (binds :: [Some TyNameRep]) term args res a | args res -> a, a -> res where
   knownPolytype :: Proxy binds -> TypeScheme term args res

instance (KnownSymbol name, KnownNat uniq, KnownKind kind, KnownPolytype binds term args res a) =>
           KnownPolytype ('Some ('TyNameRep @kind name uniq) ': binds) term args res a where
   knownPolytype _ = TypeSchemeAll @name @uniq @kind Proxy $ \_ -> knownPolytype (Proxy @binds)


KnownPolytype по сути определен "рекурсией" по первому аргументу типа [Some TyNameRep], где Some экзистенциально упаковывает кайнд. Так вот в инстансе мы матчим по 'Some и хаскель позволяет достать kind через тайп-левельный тайп-апликейшон и даже позволяет сделать по этому kind констрейт KnownKind (кастомный класс, не из бейз). То есть мы сначала упаковали в экзистенциальный тип, а потом распаковали и используем экзистенциальную переменную в вычислениях. На уровне значений пришлось бы упаковывать переменную вместе с констрейнтом, иначе когда ее оттуда достаешь, все информация потеряна и ничего о переменной уже сказать нельзя

Ну может это и не прям полноценные сигмы, но где-то близко.
Красиво, спасибо
источник

AV

Alexander Vershilov in Haskell
Maxim Koltsov
Так же как сам хттп клиент
нет
источник

AV

Alexander Vershilov in Haskell
http-cleint умеет выдавать stream
источник

AV

Alexander Vershilov in Haskell
и http-conduit это юзает
источник

R

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


data TyNameRep (kind :: GHC.Type) = TyNameRep Symbol Nat
источник

MK

Maxim Koltsov in Haskell
Умеет
источник

R

Roman in Haskell
учитывая, что Symbol и Nat живут только на тайп левеле
источник

MK

Maxim Koltsov in Haskell
Но по дефолту боди читается весь
источник