内MonadStateを使用してMemoising私は、次の(無料モナドを使って)DSLおよびそのインタプリタ持っていることを考える:ハスケル:FreeMonad通訳
data MyDslF next =
GetThingById Int (Thing -> next)
| Log Text next
type MyDslT = FT MyDslF
runMyDsl :: (MonadLogger m, MonadIO m, MonadCatch m) => MyDslT m a -> m a
runMyDsl = iterT run
where
run :: (MonadLogger m, MonadIO m, MonadCatch m) => MyDslF (m a) -> m a
run (Log message continue) = Logger.log message >> continue
run (GetThingById id' continue) = SomeApi.getThingById id' >>= continue
を私がもしそのようMonadStateを使用するために内部インタプリタを変更したいですThing
がすでにId
与え用に取得された、その後、SomeApi
への2回目の呼び出しはありません、私はすでにget
とput
を使用してmemoisedバージョンの書き方を知っていると仮定しますが、私が午前問題はを実行しています210内runMyDsl
。 私は解決策は、のようになります考えていた:
type ThingMap = Map Int Thing
runMyDsl :: (MonadLogger m, MonadIO m, MonadCatch m) => MyDslT m a -> m a
runMyDsl = flip evalStateT mempty . iterT run
where
run :: (MonadLogger m, MonadIO m, MonadCatch m, MonadState ThingMap m) => MyDslF (m a) -> m a
run ..
しかし、種類がrun
戻り(.. , MonadState ThingMap m) => m a
とevalStateT
StateT ThingMap m a
を期待するので、整列しません。