Size: a a a

2021 January 23

к

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

VS

Vyacheslav Shebanov in Haskell
проблема наверное в том, что я незнаком с имплиситами в хаскелле
источник

MK

Maxim Koltsov in Haskell
кана
вот, смотри, таскать явно везде Env это первый шаг, как прийти к имплиситам
Амбассадор имплиситов
источник

к

кана in Haskell
если весь код это IO, просто еще ридер сверху для контекста, то можно таскать его явно, но геморно. Тогда можно просто таскать его неявно

type WIthEnv = (?env :: Env)

getX :: WithEnv => Int
getX = getXFromEnv ?env

action :: WithEnv => IO Int
action = do
 action2
 pure getX

action2 :: WithEnv => IO ()
action2 = do
 print getX

main = do
 let ?env = makeEnv ...
 x <- action
 ...
источник

к

кана in Haskell
точнее таскается-то он все еще явно, просто передается неявно
источник

к

кана in Haskell
бонусом сюда идут четыре вещи:
1. бесплатный unliftio, например можно использовать дефолтный bracket (который на IO завязан, а не на РидерТ ИО)
2. не нужно лифтить io операции
3. не нужно монадическое действие чтобы достать контекст
4. ну и в целом простота решения нравится
источник

к

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

к

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

к

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

к

кана in Haskell
это никак не пофиксить, только если вместо имплиситов взять рефлекшн либу, но у нее нет local метода как в ридере (а у имплиситов есть)
источник

MK

Maxim Koltsov in Haskell
А часто тебе нужен локал кстати?
источник

к

кана in Haskell
да, я логгеры переопределяю
источник

MK

Maxim Koltsov in Haskell
А ещё локал - не алгебраическая операция!
источник

к

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

MK

Maxim Koltsov in Haskell
Я понял, да
источник

MK

Maxim Koltsov in Haskell
Саша таскает контекст явно для этого
источник

YS

Yan Shkurinskiy in Haskell
У меня через локал трассировочные айдишники тоже
источник

AA

A64m AL256m qn<co... in Haskell
кана
минусы тоже есть, нельзя просто распилить контекст на части, типа вот этого HasX паттерна, нужно заранее делать много имплиситов просто, и их можно в один констрейнт склеить
а что если имплицит с реифицированными gadt имплицитами?
источник

MK

Maxim Koltsov in Haskell
Экспрешон проблем будет
источник

AA

A64m AL256m qn<co... in Haskell
че?
источник