Когда я делаю:
cabal sandbox init
cabal update
cabal install hakaru
cabal repl
λ> :l simple.hs
λ> sample test []
с simple.hs
, содержащим:
{-# LANGUAGE MultiParamTypeClasses #-}
import Language.Hakaru.ImportanceSampler
import Control.Monad.State
instance MonadState Int Measure
test :: Measure Int
test = put 1 >> get >>= \i -> return i
моему компьютеру не хватает памяти.
Как я могу успешно сделать монаду Measure
экземпляром MonadState
(т. е. сделать так, чтобы test
выше возвращало 1
)? Тип Measure
уже является экземпляром Monad
с определенными bind
и return
. Есть ли способ по умолчанию определить put
и get
MonadState
с точки зрения lift
, bind
и return
, чтобы заставить его работать? Я старался:
get = lift get
put = lift . put
но я не мог заставить типы (трансформер?) работать:
simple.hs:6:9:
Couldn't match type ‘t0 m0’ with ‘Measure’
Expected type: Measure Int
Actual type: t0 m0 Int
In the expression: lift get
In an equation for ‘get’: get = lift get
simple.hs:7:9:
Couldn't match type ‘t1 m1’ with ‘Measure’
Expected type: m1 () -> Measure ()
Actual type: m1 () -> t1 m1 ()
In the first argument of ‘(.)’, namely ‘lift’
In the expression: lift . put