Difference between revisions of "Data declaration with constraint"

From HaskellWiki
Jump to navigation Jump to search
(short introduction with reference to current discussion)
 
(maybe multi-parameter type classes are a way out)
(One intermediate revision by the same user not shown)
Line 5: Line 5:
 
I have declared
 
I have declared
 
<haskell>
 
<haskell>
data T a = C a => Cons a
+
data C a => T a = Cons a
  +
</haskell>
  +
and I hoped that now the type checker knows,
 
that every value of type <hask>T a</hask> satisfies the type constraint on <hask>a</hask>.
  +
I like to declare an instance for an type constructor class for the type constructor <hask>T</hask>
  +
but its methods require type constraints that depend on the particular type constructor <hask>T</hask>.
  +
  +
E.g.
  +
<haskell>
  +
instance Vector T where
  +
add (Cons x) (Cons y) = Cons (x+y) -- requires Num constraint on type a
 
</haskell>
 
</haskell>
and I hoped that now the type checker knows, that every value of type <hask>T a</hask> satisfies the type constraint on <hask>a</hask>.
 
   
 
=== Answer ===
 
=== Answer ===
Line 17: Line 26:
 
== Solution ==
 
== Solution ==
   
But how can one bake type constraints into a type ? ...
+
But how can one bake type constraints into a type?
  +
You cannot. One should insert a discussion here, whether it is sensible to want this.
  +
  +
For now you have to stick to [[multi-parameter type class]]es,
  +
where <hask>T a</hask> and <hask>a</hask> are separate arguments.
   
   

Revision as of 17:43, 21 December 2007

Problem

Question

I have declared

data C a  =>  T a = Cons a

and I hoped that now the type checker knows, that every value of type T a satisfies the type constraint on a. I like to declare an instance for an type constructor class for the type constructor T but its methods require type constraints that depend on the particular type constructor T.

E.g.

instance Vector T where
   add (Cons x) (Cons y) = Cons (x+y)    -- requires Num constraint on type a

Answer

Only functions can have type constraints. The type constraint of a data only refers to the constructors. The designers of Haskell 98 do now think, that it was a bad decision to allow constraints on constructors.

Solution

But how can one bake type constraints into a type? You cannot. One should insert a discussion here, whether it is sensible to want this.

For now you have to stick to multi-parameter type classes, where T a and a are separate arguments.


See also