Подтвердить что ты не робот

Соответствие типу уровня Nat в GHC 7.6

Мой вопрос, вероятно, проще всего объяснить в форме примера:

type family   Take (n :: Nat) (xs :: [k]) :: [k]
type instance Take 0     xs        = '[]
type instance Take (n+1) (x ': xs) = x ': Take n xs

Второй экземпляр здесь отклонен, хотя, поскольку (+), являясь семейством типов, не может использоваться в аргументах. Но, похоже, не существует Succ или всего, что обычно используется для сопоставления Nats.

Итак, может ли это быть выражено; и если да, то как?

Обновление. Я замечаю, что функции isZero и isEven в GHC.TypeLits находятся под заголовком "Destructing type-nats". Они предназначены для использования на уровне типа? Я бы не подозревал... но в основном потому, что я не могу видеть, как это сделать. :)

4b9b3361