L29Ah 24.11.2012 03:32 blog-24190

ТУНЕЛЛИРУЮ ТУНЕЛЛИРУЮ
Правда, волшебный автовывод инстенсов так и не осилил. Пришлось остановиться на таком говне:

class (MonadIO o) => EmbedIO o where
type Content o
callback :: o a → Content o → IO a

-- If the inner monad is IO

data Void

instance EmbedIO IO where
type Content IO = Void
callback action _ = action

и в приложении:

runNPT_ :: NPT a → NPTState → IO a
runNPT_ x s = do
runReaderT x s

instance EmbedIO NPT where
type Content NPT = NPTState
callback act cont = runNPT_ act cont

Модифицируемый стейт будет в IORef'ах. Уродливо, но лучше я не придумал; не переписывать же MState, чтобы был кишками наружу, дабы можно было инстенс написать.

Do you really want to delete ?