Size: a a a

2017 December 10

AP

Aleksei (astynax) Pirogov in Haskell Start
Zheka Kozlov
MonadWriter более общий?
Они просто для разного. Но на Writer можно сделать простое протоколирование, раз уж список строк - моноид
источник

ZK

Zheka Kozlov in Haskell Start
Короче для логирования MonadWriter - плохая идея
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Инстанс
 (MonadLogger m, Monoid w) =>
 MonadLogger (WriterT w m)

как бы говорит нам "Writer тоже ок" :)
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Для задач логирования длительных процессов Writer не подходит, да. Потому что лог копится в памяти. Но зато - IO нет.
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Хорошая идея - абстрагировать логирование через MonadLogger. И запускать вычисление в разных ситуациях с разными "бэкендами логирования" - LoggingT, NoLoggingT, WriterT. В тестах, например, Writer может вполне пригодиться - там удобно иметь лог в виде структуры в памяти
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
А MonadWriter нужно оставить именно для тех случаев, когда некий конкретный моноид хотим накопить - Sum, First, Last, Any, All, вот это всё
источник

ZK

Zheka Kozlov in Haskell Start
В принципе MonadWriter может же быть и без накопления
источник

к

кана in Haskell Start
а какой тогда профит от него?
источник

ZK

Zheka Kozlov in Haskell Start
() не копится
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Ну нет! В стеке с MonadWriter сама монадка будет абстрагирована, но не моноид!
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
() получится, только если делать tell (), что и правда странно
источник

ZK

Zheka Kozlov in Haskell Start
стой, у tell сигнатура w -> m()
источник

ZK

Zheka Kozlov in Haskell Start
tell "Hello, world" :: IO ()
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Мы же пишем
f :: MonadWriter [String] m => m ()
f = do
 tell ["foo"]
 tell ["bar"]
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
w всегда известен
источник

ZK

Zheka Kozlov in Haskell Start
ну реализацию можно подсунуть такую, что w не будет копиться
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Можно, но она не будет соответствовать законам
источник

ZK

Zheka Kozlov in Haskell Start
это ж type class, tell просто пусть пишет в консоль
источник

AP

Aleksei (astynax) Pirogov in Haskell Start
Нельзя просто писать в консоль - IO тогда явно понадобится
источник

ZK

Zheka Kozlov in Haskell Start
instance MonadWriter String IO
источник