Implementing Semigroup for dependent pair in Idris -
i'm trying implement semigroup
interface simple dependent pair in idris, doesn't compile :
semigroup (n ** vect n f) (<+>) (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
with error
type mismatch between ty , nat
but compile :
mypair:type -> type mypair f = (n ** vect n f) semigroup (mypair f) (<+>) (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
why ? best way accomplish ?
idris faq:
if use name in type begins lower case letter, , not applied arguments, idris treat implicitly bound argument.
one approach solving problem rid of syntactic sugar , explicitly bind n
this:
semigroup (dpair nat (\n => vect n f)) (<+>) = (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
another approach use upper-case letter vector length:
semigroup (n ** vect n f) (<+>) = (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
here, n
not bound in semigroup
implementation, , allows dpair
syntactic sugar kick in , bind n
did in first variant.
as mypair
example, compiles because example equivalent dpair
example above. if remove sugar becomes clear:
mypair:type -> type mypair f = dpair nat (\n => vect n f)
Comments
Post a Comment