Мой вопрос, вероятно, проще всего объяснить в форме примера:
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". Они предназначены для использования на уровне типа? Я бы не подозревал... но в основном потому, что я не могу видеть, как это сделать. :)