Zulip Chat Archive
Stream: lean4 dev
Topic: Generalizing over `MetaM`
Joachim Breitner (Mar 25 2024 at 11:18):
I have a complicated function with callbacks that runs in MetaM, but I now want to use it at StateT … MetaM, so I am trying to generalize it. It works with
def transform
{n} [MonadLiftT MetaM n] [MonadControlT MetaM n] [Monad n] [MonadError n] [MonadEnv n] [MonadLog n]
[AddMessageContext n] [MonadOptions n]
…
but it seems a bit of an excessive list of constraints, some redundant. Is that fine, or should I approach it differently?
(Here is the actual change)
Jannis Limperg (Mar 25 2024 at 12:51):
I guess that the first three (MonadLiftT, MonadControlT, Monad) are sufficient if you write, e.g., show MetaM _ from getEnv instead of getEnv. Not sure whether that's an improvement though...
Joachim Breitner (Mar 25 2024 at 12:56):
Yeah, or just MonadControlT is enough if I wrap every operation that I need to specialize in some lift operations, but then the code gets much uglier…
Kyle Miller (Mar 25 2024 at 19:09):
Have you seen how docs#Lean.Meta.forallTelescope works? It takes a continuation in a different monad, but the underlying implementation takes a MetaM continuation. It uses docs#Lean.Meta.map2MetaM, which I haven't understood yet.
Joachim Breitner (Mar 25 2024 at 19:27):
I had a look, but I think the map2MetaM-family only works when there is a single continuation that is called exactly once; my MatcherApp.transform function is more complicated than that.
I could probably try to thread through the ControlMonadT’s stM state manually in MatcherApp. I briefly tried, but it seemed differently, but similarly annoying than the plethora of type class constraints.
Last updated: May 02 2025 at 03:31 UTC