Я пытаюсь сложить монады transfromers из scalaz
в Haskell образом:штабелирование Монада Трансформаторы в Скале
statyReader :: (MonadReader Int m, MonadState Int m) => m Int
Скал:
def statyReader[F[_]](implicit r: MonadReader[F, Int], s: MonadState[F, Int]): F[Int] = for {
counter <- s.get
secret <- r.ask
_ <- s.put(counter + secret)
} yield counter
Он компилирует с 1 неявными прошли, но не с 2 :
Error:(13, 18) value flatMap is not a member of type parameter F[Int]
counter <- s.get
^
Error:(14, 18) value flatMap is not a member of type parameter F[Int]
secret <- r.ask
^
Error:(15, 21) value map is not a member of type parameter F[Unit]
_ <- s.put(counter + secret)
^
Почему это происходит? Я предполагаю, что компилятор теперь запутался в том, что «монадический экземпляр F[_]
» он должен выбрать (оба MonadReader и MonadState продлят Monad[F[_]
). Правильно ли это?
Как преодолеть это?
мелочь: В Haskell, я бы не стал назовите это «укладчивые монадные трансформаторы», так как я буду использовать это для ссылки, например 'StateT s (ReaderT r IO) a'. Правда, в таком стеке у нас было бы несколько ограничений типа, поэтому оно связано. – chi
Я не думаю, что эти две неявные параметры являются проблемой, иначе вы получите ошибку «неоднозначные неявные значения» (см. Https://github.com/scalaz/scalaz/issues/1110). – devkat
@devkat, если я передаю только 1 неявное, вещь работает :) –