инстансу монады у меня сам сгенерировался инстанс аппикатива и функтора? Не хочу писать бойлерплейт
Functor можно: https://ocharles.org.uk/guest-posts/2014-12-15-deriving.html https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/derive-functor
если дерайвить с помощью WrappedMonad (который не для этого делался, правда) то pure будет зацикливаться
newtype ExistingMonadInstance m a = EMI (m a) instance Monad m => Functor (ExistingMonadInstance m) where fmap f (EMI v) = EMI (liftM f v) instance Monad m => Applicative (ExistingMonadInstance m) where pure = EMI . return -- единственное отличие от WrappedMonad EMI f <*> EMI v = EMI (f `ap` v) liftA2 f (EMI x) (EMI y) = EMI (liftM2 f x y) data Foo a = Foo a deriving Show deriving (Functor, Applicative) via ExistingMonadInstance Foo -- deriving (Functor, Applicative) via WrappedMonad Foo -- pure = pure instance Monad Foo where return = Foo Foo a >>= f = f a
Обсуждают сегодня