Я изучаю скалаз в эти дни. Когда я сравниваю скаляр с Haskell, я обнаруживаю, что трудно настроить мой собственный монадный преобразователь.
Код, который я могу сделать в Haskell, вот так:
newtype Box a = Box a deriving Show
-- Monad instance of Box, it's simple, I pass it..
newtype BoxT m a = BoxT {runBoxT :: m (Box a)}
instance (Monad m) => Monad (BoxT m) where
return a = BoxT $ return $ Box a
x >>= f = BoxT $ do
(Box v) <- runBoxT x
runBoxT $ f v
instance (Monad m) => Applicative (BoxT m) where
pure = return
(<*>) = ap
instance (Monad m) => Functor (BoxT m) where
fmap = liftM
Как можно Я делаю то же самое в скалазе? Я пробовал много способов, но, похоже, я не могу понять тип scala generi c, например:
case class Box[A](value:A)
case class BoxT[M[_],A](run: M[Box[A]])
implicit val monad = Monad[BoxT] { // goes wrong, type `BoxT[M[_],A]` doesn't match F[_]
... //don't know how to override functions..
}