recursive data types implemented over waffle