module Data.Product.NAry where

n-Ary products🔗

This is an alternative definition of the type of n-ary products, which, unlike Vec, is defined by recursion on the length.

Vecₓ :  {}  Type   Nat  Type 
Vecₓ A 0             = Lift _ 
Vecₓ A 1             = A
Vecₓ A (suc (suc n)) = A × Vecₓ A (suc n)

The point of having the type Vecₓ around is that its inhabitants can be written using the usual tuple syntax, so that we can define a From-product “type class” for those type constructors (possibly indexed by the length) which can be built as a sequence of arguments.

_ : Vecₓ Nat 3
_ = 1 , 2 , 3

record From-product {} (A : Type ) (T : Nat  Type ) : Type  where
  field from-prod :  n  Vecₓ A n  T n

Shuffling the arguments to from-prod slightly, we arrive at the “list syntax” construction:

[_] :  {} {A : Type } {T : Nat  Type } {n}  fp : From-product A T 
     Vecₓ A n  T n
[_]  fp = fp  = fp .From-product.from-prod _