Zulip Chat Archive
Stream: new members
Topic: unable to synthesize 'MonadEval' instance
aron (Jan 15 2025 at 00:40):
Lean won't let me eval this code
def inferTypeFromPatterns (patterns : List Pattern) : Except IncompatibleTypes Universe := ...
instance [ToString IncompatibleTypes] : MonadEval (Except IncompatibleTypes) IO where
monadEval m := IO.ofExcept m
#eval inferTypeFromPatterns patternsListOfList
because of error:
unable to synthesize 'MonadEval' instance to adapt
Except IncompatibleTypes Universe
to 'IO' or 'Lean.Elab.Command.CommandElabM'.
even though I have explicitly implemented a MonadEval
instance for Except IncompatibleTypes
? What's the problem here?
Screenshot 2025-01-15 at 00.36.39.png
Kyle Miller (Jan 15 2025 at 03:19):
Do you have a ToString IncompatibleTypes
instance?
aron (Jan 15 2025 at 09:52):
Yes I do
structure IncompatibleTypes where
t1 : Universe
t2 : Universe
instance [ToString Universe] : ToString Universe where
toString :=
fun u =>
match u with
| Universe.unit => "()"
| Universe.option u => "Option " ++ toString u
| Universe.result ok err => "Result " ++ toString ok ++ " " ++ toString err
| Universe.list u => "List " ++ toString u
| Universe.any => "*"
instance [ToString Universe] : ToString IncompatibleTypes where
toString := fun e =>
"Incompatible types: " ++ toString e.t1 ++ " and " ++ toString e.t2
Kyle Miller (Jan 15 2025 at 17:51):
instance [ToString Universe] : ToString Universe
doesn't work as a way to define that instance. You should be able to check that #synth ToString Universe
fails, or you should observe that if you apply toString
to a term of Universe
there will be an error.
Instead, you should define a recursive function first that creates that string, and then you can define the instance with it, without this [ToString Universe]
argument.
If you posted a #mwe, I might have had a moment to write it and test that it worked.
aron (Jan 16 2025 at 01:44):
Ah ok that makes sense, yes. I did instance [ToString Universe] : ToString Universe
because it it insisted that Universe
needed to be an instance of ToString
, otherwise it didn't let me call toString
on it recursively
But this now works!
Last updated: May 02 2025 at 03:31 UTC