我的问题最好通过一个例子来解释:
type family Take (n :: Nat) (xs :: [k]) :: [k]
type instance Take 0 xs = '[]
type instance Take (n+1) (x ': xs) = x ': Take n xs
第二个实例被拒绝了,因为(+)
本身是一个类型族,无法在参数中使用。但似乎没有任何通常用于匹配Nats的Succ
或其他任何东西。
那么,这个能否表达呢?如果可以,应该如何表达?更新。我注意到
GHC.TypeLits
中的isZero
和isEven
函数位于“Destructing type-nats”标题下。它们是否打算在类型层面上使用?我怀疑不是……但主要是因为我看不出如何做到。:)
isZero
和isEven
函数构造了同名的GADTs,这些GADTs可以在术语级别上访问类型级谓词。换句话说,这是一种在常规术语级函数中进行所需匹配的方法,而不是一种类型函数。 - C. A. McCann