Вы просто разворачиваете и перематываете каждую операцию.Сложнее всего выяснить, где происходит разворачивание и переупаковка:
newtype PGm a = PGm (IO a)
instance Monad PGm where
(>>=) (PGm a) b = PGm (a >>= (unPGm . b))
where
unPGm (PGm x) = x
(>>) (PGm a) (PGm b) = a >> b
return a = PGm (return a)
fail a = PGm (fail a)
Однако этого будет недостаточно, поскольку Haskell требует экземпляры для Functor
и Applicative
перед экземпляром Monad
может быть определеноБолее простым решением было бы поставить {-# LANGUAGE GeneralizedNewtypeDeriving #-}
в верхней части вашего файла (или включить :set -XGeneralizedNewtypeDeriving
в GHCi), что позволяет вам сделать это;
newtype PGm a = PGm (IO a) deriving (Functor, Applicative, Monad)
Идея состоит в том, что если вы включите эторасширение, GHC будет достаточно умен, чтобы автоматически извлекать экземпляры нового типа из своих «базовых» экземпляров.