[Haskell-cafe] Re: Type constrain in instance?

Louis Zhuang louis.zhuang at acm.org
Fri Apr 9 14:40:32 EDT 2010

Casey McCann <syntaxglitch <at> gmail.com> writes:

> {-# LANGUAGE MultiParamTypeClasses, GADTs #-}
> import qualified Control.Category as Cat
> data ChainableFunction a b where
>     CF :: (Num a, Num b) => (a->b) -> (a->b) -> ChainableFunction a b
>     CFId :: ChainableFunction a a
> instance Cat.Category ChainableFunction where
>     id = CFId
>     CF g g' . CF f f' = CF (g.f) (\a -> f' a *> g' (f a))
>     CFId . f = f
>     g . CFId = g
> You've probably noticed that I've been ignoring the Module class.
> Unfortunately, the solution thus far is insufficient; a Module
> constraint on the CF constructor does work as expected, providing a
> context with (Module a b, Module b c), but the result requires an
> instance for Module a c, which neither available, nor easily obtained.
> I'm not sure how best to handle that issue; if you find the rest of
> this useful, hopefully it will have given you enough of a start to
> build a complete solution.
> - C.

Thanks for the comment. If we try to use GADT to construct Cat.id, actually
(Numa) constraint is redundant because I just want "1" for first derivative
of x.

However instance (Module a b, Module b c) => Module a c is a must for
chain rule... I'm looking at Data.Category suggested by Jason, because it
allows subset of Hask object to be applied into parameters

More information about the Haskell-Cafe mailing list