@haskellru

Страница 112 из 1551
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
я понял

Страница 112 из 1551