[Haskell-beginners] Monad instances and type synonyms

Brent Yorgey byorgey at seas.upenn.edu
Sun Apr 14 14:09:16 CEST 2013


On Sat, Apr 13, 2013 at 05:03:57PM -0800, Christopher Howard wrote:
> I am playing around with some trivial code (for learning purposes) I
> wanted to take
> 
> code:
> --------
> -- SaleVariables a concrete type defined early
> 
> -- `Adjustment' represents adjustment in a price calculation
> -- Allows functions of type (a -> Adjustment a) to be composed
> -- with an appropriate composition function
> type Adjustment a = SaleVariables -> a
> --------
> 
> And put it into
> 
> code:
> --------
> instance Monad Adjustment where
> 
>   (>>=) = ...
>   return = ...
> --------
> 
> If I try this, I get
> 
> code:
> --------
> Type synonym `Adjustment' should have 1 argument, but has been given none
> In the instance declaration for `Monad Adjustment'
> --------
> 
> But if I give an argument, then it doesn't compile either (it becomes a
> "*" kind). And I didn't want to make the type with a regular "data"
> declaration either, because then I have to give it a constructor, which
> doesn't fit with what I want the type to do.

Sorry, what you're trying to do is simply not possible.  Type synonyms
must always be fully applied.  So if you want to make Adjustment an
instance of Monad then you have to make it a newtype.

However... Adjustment already *is* an instance of Monad!  (In
particular ((->) e) is an instance for any type e.)  So there's no
need for you to redeclare an instance yourself.  These days I think
you just have to import Control.Monad to bring the instance in scope.

-Brent



More information about the Beginners mailing list