ちょっとした楽しみとして、どれくらいの長さかわかる Type レベルのリストを作成したいと思いました。このようなもの:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data family TypeList a (n::Nat)
data instance TypeList a (0) = EmptyList
data instance TypeList a (1) = TL1 a (TypeList a (0))
data instance TypeList a (2) = TL2 a (TypeList a (1))
data instance TypeList a (3) = TL3 a (TypeList a (2))
しかし、もちろん、これを次のように一般化したいと思います。
data instance TypeList a (n) = TL3 a (TypeList a (n-1))
しかし、これはエラーを生成します:
TypeList.hs:15:53: parse error on input `-'
Failed, modules loaded: none.
別の試み:
data instance TypeList a (n+1) = TL3 a (TypeList a (n))
また、エラーが生成されます。
Illegal type synonym family application in instance: n + 1
In the data instance declaration for `TypeList'
このようなことが可能でなければならないと思います。次の表記法を使用することは間違いなく可能です。
data Zero
data Succ a
しかし、見栄えの良いバージョンではわかりません。