Tôi đang cố gắng để ngăn xếp transfromers đơn nguyên của scalaz
một cách Haskell:Stacking Monad Transformers trong scala
statyReader :: (MonadReader Int m, MonadState Int m) => m Int
scala:
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
Nó biên dịch với 1 tiềm ẩn trôi qua, nhưng không phải với 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)
^
Tại sao điều này lại xảy ra? Tôi đoán là trình biên dịch bây giờ là nhầm lẫn mà "dụ monadic của F[_]
" nó nên chọn (cả MonadReader và MonadState mở rộng Monad[F[_]
). Đây có phải là đoán đúng không?
Cách khắc phục điều này?
điểm nhỏ: Trong Haskell, tôi sẽ không gọi đây là "stad monad transformers" kể từ khi tôi sử dụng nó để tham khảo ví dụ 'StateT s (ReaderT r IO) a'. Đúng là, mặc dù vậy, trong ngăn xếp như vậy, chúng ta sẽ có nhiều ràng buộc kiểu, vì vậy nó có liên quan. – chi
Tôi không nghĩ rằng hai tham số ngầm là vấn đề, nếu không bạn sẽ nhận được lỗi "giá trị tiềm ẩn mơ hồ" (xem https://github.com/scalaz/scalaz/issues/1110). – devkat
@devkat nếu tôi vượt qua chỉ 1 ẩn, điều hoạt động :) –