added (conditionally) GADTs to get printf return type to be IO ()