haskell - Coincidencia en el nivel de tipo Nat en GHC 7.6
type-families type-level-computation (1)
Mi pregunta es probablemente la más fácil de explicar en forma de un ejemplo:
type family Take (n :: Nat) (xs :: [k]) :: [k]
type instance Take 0 xs = ''[]
type instance Take (n+1) (x '': xs) = x '': Take n xs
La segunda instancia aquí se rechaza, sin embargo, porque (+)
, al ser una familia de tipos, no se puede usar en los argumentos. Pero no parece haber ningún Succ
o algo que se use generalmente para emparejar Nats.
Entonces, ¿se puede expresar esto? Y si es así, ¿cómo?
Actualizar isEven
funciones isZero
e isEven
en GHC.TypeLits
están bajo el encabezado "Destructing type-nats". ¿Están destinados a ser utilizados en el nivel de tipo de alguna manera? Yo sospecharía que no ... pero sobre todo porque no puedo ver cómo. :)
Creo que este es un problema conocido en la implementación actual de TypeNats. Pero se está trabajando en él, eche un vistazo a: https://plus.google.com/117760254622432568621/posts/iMYU2SMViay