-
Notifications
You must be signed in to change notification settings - Fork 380
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multiple constrains with unreseolved type parameters on interface declaration cause typecheck issue #56
Comments
Comment by gallais Isn't the problem under-constrained? |
Comment by fabianhjr I extracted this from some testing I am doing with Bools and Group interfaces, module Algebra.Group.Commutative
import Builtin
import Algebra.Group.Magma
import Algebra.Group.Semigroup
import Algebra.Group.Monoid
import Algebra.Group.Group
%default total
public export
interface Magma a ⇒ CommutativeMagma a where
proofOfCommutativity : (x, y: a) → x `op` y = y `op` x
public export
interface (CommutativeMagma a, Semigroup a) => CommutativeSemigroup a where
public export
interface (CommutativeMagma a, Monoid a) => CommutativeMonoid a where
public export
interface (CommutativeMagma a, Group a) => CommutativeGroup a where
{-
-- TODO: Uncomment when Idris2!306 gets fixed
(CommutativeMagma a, Semigroup a) => CommutativeSemigroup a where
(CommutativeMagma a, Monoid a) => CommutativeMonoid a where
(CommutativeMagma a, Group a) => CommutativeGroup a where
-} So the idea is that from: [BoolSumMagma] Magma Bool where
False `op` False = False
_ `op` _ = True
[BoolSumCommutativeMagma] CommutativeMagma Bool using BoolSumMagma where
proofOfCommutativity False False = Refl
proofOfCommutativity False True = Refl
proofOfCommutativity True False = Refl
proofOfCommutativity True True = Refl The implementations of Since it was the same error message when reduced to the one on the first message I left it as reduced as possible. |
Comment by fabianhjr Oh, wait I get what you are refering to now. module Test
interface Interface1 a where
x : a
interface Interface2 a where
y : a
interface (Interface1 a, Interface2 a) => InterfaceMix a where
op : a -> a -> a
z : a
z = x `op` y This works and is less hacky |
I still believe that the original problem was under-constrained |
Issue by fabianhjr
Tuesday Apr 21, 2020 at 20:32 GMT
Originally opened as edwinb/Idris2-boot#306
Steps to Reproduce
Expected Behavior
Typecheck
Observed Behavior
The text was updated successfully, but these errors were encountered: