Idris2
Idris2 copied to clipboard
Declaring data type in the `where` clause gives a unification error
Idris2 version (HEAD as of the time of raising the issue):
$ idris2 --version
Idris 2, version 0.2.1-df4c454f4
Steps to Reproduce
Here is the code:
module WhereError
-- source: https://idris2.readthedocs.io/en/latest/tutorial/typesfuns.html
foo : Int -> Int
foo x = case isLT of
Yes => x*2
No => x*4
where
data MyLT = Yes | No
isLT : MyLT
isLT = if x < 20 then Yes else No
Expected Behavior
Program compiles and runs correctly when supplied an Int.
Observed Behavior
1/1: Building WhereError (WhereError.idr)
WhereError.idr:5:14--5:18:While processing right hand side of foo at WhereError.idr:5:1--12:41:
When unifying MyLT x and Dec ?_
Mismatch between:
MyLT x
and
Dec ?_
at:
5 foo x = case isLT of
^^^^
It has something to do with ambiguous name resolution, this typechecks:
foo : Int -> Int
foo x = case isLT of
Yes' => x*2
No' => x*4
where
data MyLT = Yes' | No'
isLT : MyLT
isLT = if x < 20 then Yes' else No'
Yes and No are also constructors of Dec type.
It has something to do with ambiguous name resolution, this typechecks:
foo : Int -> Int foo x = case isLT of Yes' => x*2 No' => x*4 where data MyLT = Yes' | No' isLT : MyLT isLT = if x < 20 then Yes' else No'
YesandNoare also constructors ofDectype.
Interesting! I think then that at least the error message must be suitably improved, or the name resolution, or both?
EDIT: Especially since lifting the declaration to the top-level fixes the issue as well:
module WhereDemo
data MyLT = Yes | No
foo : Int -> Int
foo x = case isLT of
Yes => x * 2
No => x * 4
where
isLT : MyLT
isLT = if x < 20 then Yes else No
Test:
1/1: Building WhereDemo (WhereDemo.idr)
WhereDemo> foo 100
400
WhereDemo> foo 19
38
Just stumbled on this error while following https://idris2.readthedocs.io/en/latest/tutorial/typesfuns.html#where-clauses could we move forward with its resolution?
To sum-up we have at least two options:
- Wrapping wheres.idr in a module as suggested here https://github.com/idris-lang/Idris2/issues/588#issuecomment-678779247
- Rename
YesandNoto avoid clashing.
I don't mind doing it but as a noob I need to be told what to do.
I think it may be caused in part by
https://github.com/idris-lang/Idris2/blob/05c9029b35c64873ab3ea13822039f004acd1101/src/TTImp/Elab/Case.idr#L243-L245
we throw out the nested names that were carried until we hit the case.
It's strange though because we don't get an out of scope error if we rename
the constructors. Very confusing.
I wonder whether this is related to #694 too.
was following crash course, got confused at the error message, and eventually landed here.
sorry for necroposting, but it'd be really nice to update documentation with workarounds before fix lands as it may confuse future idris2 beginners. that is, @gallais should i make a PR for adding workaround in the doc?