У меня есть этот типа, в основном Клейл стрелок:ApplicativeDo не работает с секвенирование
{-# language DeriveFunctor #-}
data Plan m i o = Plan (i -> m o) deriving Functor
instance (Monad m) => Applicative (Plan m i) where
pure x = Plan (\_ -> pure x)
Plan f <*> Plan x = Plan (\i -> f i <*> x i)
Поскольку он имеет Applicative
экземпляр, я включаю ApplicativeDo
и попытаться построить значение, используя делать-обозначения:
{-# language ApplicativeDo #-}
myplan :: Plan IO()()
myplan = do
pure()
pure()
это не работает:
No instance for (Monad (Plan IO())) arising from a do statement
есть ли способ сделать это им гк? Я использую GHC 8.0.1.
Это может быть 'pure() *> pure()' хотя. Почему он этого не делает? – Gurkenglas
Я не уверен, есть ли причина, кроме «это не так». Может быть, основная причина, по которой 'a >> b' и' a *> b' может быть тонкой по-другому, или просто может быть, что первоначальная реализация desugaring ограничивает себя 'fmap' и' <*> 'для простоты. – chepner
@chepner Когда я пишу каждое утверждение, подобное '_ <- pure()', похоже, оно работает. – danidiaz