Monads Idris中ST中使用Functor/Applicative/Monad构造的惯用方法

Monads Idris中ST中使用Functor/Applicative/Monad构造的惯用方法,monads,idris,Monads,Idris,我尝试在STdo块中使用when:Applicative f=>Bool->Lazy(f())->f() loop : (ConsoleIO m, Draw m) => (draw : Var) -> (state : GameState) -> ST m () [draw ::: SDraw {m}] loop draw state = with ST do print (f state) -- works when Tr

我尝试在
ST
do块中使用
when:Applicative f=>Bool->Lazy(f())->f()

loop : (ConsoleIO m, Draw m) =>
       (draw : Var) ->
       (state : GameState) ->
       ST m () [draw ::: SDraw {m}]
loop draw state = with ST do

  print (f state) -- works

  when True (print (f state)) -- error

  ?what
这是一个错误,因为
ST
显然不是应用程序,它只支持
do
语法

我假设还有其他有用的functor/applicative/monad函数也因此不受支持

是否有一些惯用的解决方案来解决这个问题