Резервирование в классе MonadWriter - PullRequest
0 голосов
/ 06 июля 2018

Я читаю документацию для класса MonadWriter и вижу, что writer и tell могут быть записаны в терминах друг друга. Мне кажется, что если методы класса ведут себя так, как описано в документации, то pass можно записать в терминах tell и listen:

pass :: m (a, w -> w) -> m a
pass m = do
    ((a, f), w) <- listen m
    tell $ f w
    return a

Правильно ли мое понимание?

1 Ответ

0 голосов
/ 06 июля 2018

В итоге пишется w <> f w, но должно записываться f w.

ghci
> import Control.Monad.Writer as W
> :{
pass m = do
  ((a, f), w) <- listen m
  tell (f w)
  return a
:}
> pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[1,11]))
> W.pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[11]))
...