Создать оболочку haskell IO - PullRequest
       13

Создать оболочку haskell IO

0 голосов
/ 24 февраля 2019

В разделе руководства GHC по FFI указано, что программист может использовать newtype для создания монады-обертки вокруг монады ввода-вывода и использовать ее вместо монады ввода-вывода при вызове стороннего кода.( Руководство по GHC )

Пока у меня есть:

newtype PGm a = PGm (IO a)
instance Monad PGm where
   (>>=) a b = ...
   (>>)  a b = ...
   return a  = PGm (return a) --I think
   fail a    = PGm (fail a)   --I think

Я в недоумении относительно того, как реализовать (>>=) и (>>).

1 Ответ

0 голосов
/ 24 февраля 2019

Вы просто разворачиваете и перематываете каждую операцию.Сложнее всего выяснить, где происходит разворачивание и переупаковка:

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 будет достаточно умен, чтобы автоматически извлекать экземпляры нового типа из своих «базовых» экземпляров.

...