{-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeFamilies #-} import Data.Kind (Type) data Nat = Z | S Nat data family QuadTree :: Nat -> Type -> Type newtype instance QuadTree Z a = Leaf a data instance QuadTree (S n) a = Branch (QuadTree n a) (QuadTree n a) (QuadTree n a) (QuadTree n a)