Size: a a a

PureScript — русскоговорящее сообщество

2019 October 26

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Anton Kotenko
Ещё раз вопрос про Union-типы и forall.

Допустим, есть такой тип:

data X 
    = Var1 (Int -> Effect Unit)
   | Var2 (String -> Effect Unit)
   | Var3 (forall st. Tuple st (st -> Effect st))


где st — это состояние, которое "фолдится" между "вызовами" функции, и в момент "вызова" это должен быть один и тот же тип.

Tuple <изначальное состояние> (<предыдущее состояние> -> Effect <следующее состояние>)

Пытаюсь написать хэндлер для подобного типа, но мне компилятор пишет The type variable st has escaped its scope в любом случае, где участвует Effect. Обработчик работает с st только внутри и не "возвращает" его наружу.

Вопрос: Я продолжаю неправильно понимать forall.? Мне кажется, в этом месте я сообщаю, что st будет в пределах "вызова" функции одинаков и этой гарантии должно быть достаточно.
Сделал так (с пекеджем purescript-exists):

newtype StateF st = StateF (Tuple st (st -> Effect st))

data X
   = Var1 (Int -> Effect Unit)
   | Var2 (String -> Effect Unit)
   | Var3 (Exists StateF)

handler :: X -> Effect Unit
handler (Var1 f) = f 1
handler (Var2 f) = f ""
handler (Var3 f') = do
   _ <- runExists
               (\(StateF (Tuple initialState f)) -> do
                   _ <- f initialState
                   pure unit
               )
               f'
   pure unit

Теперь другой вопрос, можно ли обойтись без обёртки newtype и без пакета (посмотрел в тип runExists и показалось, что всё-таки можно)?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Anton Kotenko
Сделал так (с пекеджем purescript-exists):

newtype StateF st = StateF (Tuple st (st -> Effect st))

data X
   = Var1 (Int -> Effect Unit)
   | Var2 (String -> Effect Unit)
   | Var3 (Exists StateF)

handler :: X -> Effect Unit
handler (Var1 f) = f 1
handler (Var2 f) = f ""
handler (Var3 f') = do
   _ <- runExists
               (\(StateF (Tuple initialState f)) -> do
                   _ <- f initialState
                   pure unit
               )
               f'
   pure unit

Теперь другой вопрос, можно ли обойтись без обёртки newtype и без пакета (посмотрел в тип runExists и показалось, что всё-таки можно)?
да, бинды вместо do-нотации :)
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Anton Kotenko
Сделал так (с пекеджем purescript-exists):

newtype StateF st = StateF (Tuple st (st -> Effect st))

data X
   = Var1 (Int -> Effect Unit)
   | Var2 (String -> Effect Unit)
   | Var3 (Exists StateF)

handler :: X -> Effect Unit
handler (Var1 f) = f 1
handler (Var2 f) = f ""
handler (Var3 f') = do
   _ <- runExists
               (\(StateF (Tuple initialState f)) -> do
                   _ <- f initialState
                   pure unit
               )
               f'
   pure unit

Теперь другой вопрос, можно ли обойтись без обёртки newtype и без пакета (посмотрел в тип runExists и показалось, что всё-таки можно)?
Зачем? Там unsafeCoerce элиминируется, так что с purescript-exists все ок
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Можно заенкодить через негейшн, но это будет оверхед
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Может тебе просто ST нужен был?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
может быть, но не сообразил как прикрутить в этом варианте
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Зигохистоморфный Препроморфизм
Зачем? Там unsafeCoerce элиминируется, так что с purescript-exists все ок
обёртка мешается из-за того, что в реальном коде Var3 и StateF выходит назвать только разницей в прайм (по смыслу нету разницы между названиями)
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Anton Kotenko
может быть, но не сообразил как прикрутить в этом варианте
пробую, проблема в том, что фунцкия с эффектом, то есть либо в STRef класть значение внутри эффекта, либо вообще непонятно :)
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Anton Kotenko
пробую, проблема в том, что фунцкия с эффектом, то есть либо в STRef класть значение внутри эффекта, либо вообще непонятно :)
Монадный трансформер?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
для ST нету вроде бы
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Для хаскеля есть?
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
STT :D
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
типа того :). тоже нет, можно свой нагородить, конечно
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
но ради одного кейса не хочется
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
по смыслу ST, конечно, больше подходит
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
вернусь на exists пока что, если есть видение/пример, как это: https://t.me/purescript_ru/5128 через ST сделать, прошу сообщить :)
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Сегодня вообще не буду доступен к компу
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Зигохистоморфный Препроморфизм
Сегодня вообще не буду доступен к компу
Не срочно и опциально, когда будет время.
источник
2019 October 27

GP

Gleb Patsiia in PureScript — русскоговорящее сообщество
Привет
источник