Size: a a a

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

2018 August 22

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
я тоже пока что не очень пойму  как "монадно" делать сложные приложения, сейчас у меня приложение — Eff (Either Err Model) и очень больно в каждой функции API оборачивать эффекты и т.п. (может должно быть Either Err (Eff Model)?). Думал переписать на Expect но не уверен что сильно разгрузит. Универсального подхода к приложениям с ошибкой и эффектами я не нашёл и вот такой кажется довольно разумным.
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
ExpectT Err Eff Model?
источник

ЗП

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

AK

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

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Проблема в том что есть множество функций вида:

... -> ... -> Model -> Eff (Either Err Model)
... -> Model -> Eff (Either Err Model)
... -> ... -> Model -> Eff (Either Err Model)

изредка бывают:

... -> ... -> Model -> Eff (Either Err a)
... -> Model -> Eff (Either Err a)
... -> ... -> Model -> Eff (Either Err a)

хочется уметь все их чейнить, то есть брать модель из предыдущего вызова и, без боли, "распаковывая" или пробрасывая дальше ошибку, отдавать в следующий. Что поможет? do-нотация? Заимплементить <*>?

Здесь пишу Either потому что сейчас так, на Expect только начал менять и параллельно рассматриваю альтернативные подходы
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
поэтому пока что сделал:

type UI a = Effect (Either MyError a)


и:

uiAp :: forall a b. UI a -> (a -> UI b) -> UI b
uiAp eff f =
   eff >>= either (pure <<< Left) f


и сделал из последней функции оператор, может быть это очень глупо и/или повторяет тот же ContT, но работает.

как раз из-за того что способов слишком много (в каждой статье и примерах которые нахожу — свой), не могу решить какой выбрать.
источник

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
я не смог понять, речь ведь просто о Monad для Either?
источник

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
т.е. для таких вещей обычно используют`ExceptT e m a`
источник

VY

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

VY

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

AK

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

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
То есть он там вообще объясняет как придти к этому
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Vasiliy Yorkin
т.е. для таких вещей обычно используют`ExceptT e m a`
супер, тогда выход точно в ней 👍
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Vasiliy Yorkin
То есть он там вообще объясняет как придти к этому
да, изучу статью, её не читал ещё, вообще до Бартоша ещё не добрался
источник
2018 August 23

p

parket in PureScript — русскоговорящее сообщество
А как можно расширить синоним для рекорда?

type Foo = { a :: String }
type Bar = { Foo | { b :: String } }
источник

к

кана in PureScript — русскоговорящее сообщество
type Foo r = { r | a :: String }
type Bar = Foo { b :: String }


как минимум так
источник

p

parket in PureScript — русскоговорящее сообщество
Так не годится.

Есть синоним для рекорда. Нужен похожий рекорд, но на одно поле больше.
источник

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
а почему не годится? это вроде именно то, что написано выше
источник

к

кана in PureScript — русскоговорящее сообщество
мб рекорд из либы
источник

к

кана in PureScript — русскоговорящее сообщество
если бы был свой, я бы сделал

type Foo' r = { r | a :: String }
type Foo = Foo' {}

тогда бы код не менялся старый
источник