Мой вопрос, наверное, проще всего объяснить на примере:
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
находятся под заголовком« Уничтожение типов ». Предназначены ли они как-то для использования на уровне типов? Я бы подозревал, что нет ... но в основном потому, что не знаю, как это сделать. :)
isZero
иisEven
создают одноименные GADT, которые предоставляют доступ к предикату уровня типа на уровне термина. Другими словами, это способ найти соответствие, которое вы хотите, в обычной функции на уровне термина, а не в функции типа. : [ - person C. A. McCann   schedule 26.09.2012