3 ways to model an interface in haskell