Bir haskell şekilde scalaz
arasında monad transfromers yığını çalışıyorum içinde:İstifleme Monad Transformers 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
Odada 1 örtük geçti, ancak 2 ile birlikte derler :
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)
^
Bu neden oluyor? Benim tahminim, derleyicinin şimdi "F[_]
monadik örneğinin" seçilmesi gerektiğidir (hem MonadReader hem de MonadState, Monad[F[_]
'u uzatır). Bu doğru bir tahmin mi?
Bu nasıl aşılır?
Minör nokta: Haskell'de, yapmazdım Bu "istifleme monad transformatörleri" olarak adlandırıyorum çünkü bunu kullanmak için kullanacağım Durum (ReaderT r IO) a'. Yine de, böyle bir yığında, çoklu tip kısıtlamalarına sahip olacağımız doğrudur, bu yüzden ilişkilidir. – chi
İki örtük parametrenin sorun olduğunu düşünmüyorum, aksi halde "belirsiz örtük değerler" hatasını alırsınız (bkz. Https://github.com/scalaz/scalaz/issues/1110). – devkat
@devkat Eğer sadece 1 dolaylı geçerse, o şey işe yarar :) –