
Anatolii
31.08.2016
18:50:08
как в хаскеле это делают?
или мне надо было делать какой-то RedmineClientT и JiraClientT ?

Alexander
31.08.2016
18:50:45
ну можно как ты через класс типов для каждого сервиса

Anatolii
31.08.2016
18:50:52
ну да

Google

Alexander
31.08.2016
18:50:55
MonadRedmineClient и MonadJiraClient

Anatolii
31.08.2016
18:50:55
я вот так и хотел

Alexander
31.08.2016
18:51:21
и instance MonadRedmineClient MyMegaMonad where ... instance MonadJiraClient MyMegaMonad where ..

Anatolii
31.08.2016
18:51:44
ну вот у меня так сверху же сделано
или нет?
и что ты под MyMegaMonad понимаешь?:)

Alexander
31.08.2016
18:52:10
и потом
runMyMegamonad = do {
{ a <- anyRedmineAction
; b <- anyJiraAction
}

Anatolii
31.08.2016
18:52:42
не знал что тут снипеты есть:)

Alexander
31.08.2016
18:53:53
newtype MyMegaMonad a = MyMegaMonad { runMyMegaMonad :: ReaderT Env (StateT (JiraState, RedmineState, Qu)) a }
deriving (Function, Applicative, Monad, MonadReader Env, MonadState (JiraState, RedmineState,Qu))
нппример

Anatolii
31.08.2016
18:54:23
ха, я думал насчет общего State

Alexander
31.08.2016
18:54:26
тут у тебя проблема что ты в одном mtl хочешь 2 разных MonadState если я правильно прочитал

Anatolii
31.08.2016
18:54:28
и пару положить

Google

Anatolii
31.08.2016
18:54:32
да

Alexander
31.08.2016
18:54:32
в этом проблема

Anatolii
31.08.2016
18:54:33
так и есть
да
я понимаю

Alexander
31.08.2016
18:55:04
но к вопросу как тестируют это не сильно относится, это отдельный конкретный implementation detail
я вообще всегда как-то по другому делаю, давай я сслки на пакеты накидаю, может что интересное найдешь

Anatolii
31.08.2016
18:55:27
просто если приложение будет разростаться - то вот этот StateT будет очень сильно разростаться
да
давай
будет отлично

Alexander
31.08.2016
18:55:43
https://hackage.haskell.org/package/monad-classes

Anatolii
31.08.2016
18:56:01
а то я прочитал главу mtl в RealWorldHaskell
и вот пока не могу с ними подружиться
уже 3-ий день кручу верчу

Alexander
31.08.2016
18:57:12
как по юзеру искать на hackage?

Anatolii
31.08.2016
18:57:27
я не знаю:(

Alexander
31.08.2016
18:57:32
http://hackage.haskell.org/package/monad-levels
во
ну и эффекты

Google

Anatolii
31.08.2016
18:58:11
первая от Чепляки:)
и серия статей даже есть
но судя по коду там можно сделать как раз то что я хочу

Alexander
31.08.2016
18:58:35
http://hackage.haskell.org/package/extensible-effects

Anatolii
31.08.2016
18:58:38
с двумя стэйтами разными:)

Alexander
31.08.2016
18:58:52
http://hackage.haskell.org/package/freer
ну я про это и говорил

Anatolii
31.08.2016
18:59:27
ты вот этим всем пользуешся в таких случаях?

Alexander
31.08.2016
18:59:32
у roche и ещё у кого-то
нет : )

Anatolii
31.08.2016
18:59:44
:)

Alexander
31.08.2016
19:00:00
у меня честно почти не возникало ситуации когда мне нужно МонадФуБар оьъединять

Alexander
31.08.2016
19:00:08
с разными стейтами

Anatolii
31.08.2016
19:00:11
а как тогда ты в таких ситуациях делаешь?:)

Alexander
31.08.2016
19:00:20
когда надо было то можно линзы

Anatolii
31.08.2016
19:00:23
понятно
я до линз еще не дошел

Alexander
31.08.2016
19:00:33
а так у меня чаще код достаточно простой что не лень TF
трансформеры
где нету магии с автоматическими лифтами, но и нет проблем

Google

Anatolii
31.08.2016
19:01:15
это когда StateT и т.д.?

Alexander
31.08.2016
19:01:18
да

Anatolii
31.08.2016
19:01:36
я ж так понял можно похожее писать MonadState MonadReader...

Alexander
31.08.2016
19:01:42
вообще в последнее время у меня код сильно в IO

Anatolii
31.08.2016
19:01:43
но мне это тоже магией показалось

Alexander
31.08.2016
19:01:50
ну или каким-нить враппером над ним
и мне лень городить стеки монад поверх

Anatolii
31.08.2016
19:02:05
ну вот ты же врапер делаешь
понятно

Alexander
31.08.2016
19:02:29
хотя я мне эта привычка не нравится

Admin
ERROR: S client not available

Anatolii
31.08.2016
19:02:45
ну просто я всегда люблю изолировать IO

Alexander
31.08.2016
19:02:47
лучше по умолчанию - городить и потом, если есть понимание, что это не нужно то не делать

Anatolii
31.08.2016
19:02:50
везде так стараюсь делать

Alexander
31.08.2016
19:03:05
ну у меня последнее время сплошной Process

Anatolii
31.08.2016
19:03:05
ну и в других языках всмысле

Alexander
31.08.2016
19:03:11
или фримонадка над ним

Anatolii
31.08.2016
19:03:21
Process - это что?

Alexander
31.08.2016
19:04:21
монада
в Contol.Distributed.Process

Google

Alexander
31.08.2016
19:05:11
которая newtype Process a = P (ReaderT ProcessEnv IO a)

Anatolii
31.08.2016
19:05:53
аа
поянтно
я еще не добрался
я в делклраации func не хочу писать что там State
потому что State - только ддля тестов нужен
по сути in-memory база юзеров

Alexander
31.08.2016
19:07:20
https://www.schoolofhaskell.com/user/meiersi/the-service-pattern

Anatolii
31.08.2016
19:07:24
в приложении все в IO убдет а не в state

Alexander
31.08.2016
19:07:28
держи
это другой подход
в данном случае у тебя ж MyMegaMonad и ничего про стейт нет
у тебя может быть MyProductionMonad и MyTestMonad
где в одном случае state а в другом общение с базой

Anatolii
31.08.2016
19:09:03
это вместо JiraState будет JiraIO какой-то ?
аа
нет
я понял
спасибо
2 вечера пытался загнать эти 2 State в эту функцию:)

Alexander
31.08.2016
19:10:13
newtype MyProductionMonad a = MPM { ReaderT JiraLogin (ReaderT RedmineLogin IO) a }
например

Anatolii
31.08.2016
19:10:37
я понял