Well HList gives you something which behaves like a tuple with generic size. The difference between an HList and a type like (a * (b * (c * unit))) is that the HList can use the regular list syntax which is much nicer to match on (especially with type constructor disambiguation). Eg one could imagine a varadic list map function which behaves a bit like map in lisps (ie accepting any positive number of lists). Although this would need multiple types that look like lists because of the lack of higher kinded types in reason/ocaml