Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatic instance deriving after declaration

In Haskell, when defining a data type you can choose to automatically derive some instances, but can I defer the automatic deriving, perhaps even put it in another library?

Here is an example:

Automatic deriving in Haskell is a real time saver!

module MoneyModule where

data Money = Money Int
  deriving Show

Now I wish to use the MoneyModule, but I also want a Read instance for Money:

module ExternalModule where

instance Read Money where
  read = error "Can't this be done automatically instead?"

But I would really have preferred for it to be derived automatically, which I know ghc could have done if only the MoneyModule author had auto-derived the Read instance.


I know that:

  • It's better to fix the problem in the actual MoneyModule by patching it with the missing instance.
  • That it's considered bad to have orphan instances. Instance declarations are preferably put in the module where either the type class or the data type was defined.

In my case I can't follow best practices since the type class is unrelated to the data type. I doubt that the type class module nor the data type module wants to hold the instance, so therefore I'm creating a third library because in some applications you need the instance declaration.

like image 412
Tarrasch Avatar asked Oct 12 '12 04:10

Tarrasch


1 Answers

GHC has the StandaloneDeriving extension, with that, you can

{-# LANGUAGE StandaloneDeriving #-}
import MoneyModule

deriving instance Read Money

derive instances for many classes.

like image 86
Daniel Fischer Avatar answered Sep 24 '22 02:09

Daniel Fischer