3 different ways to model an interface in Haskell