
The answer would be phantom types, but your example doesn't use them. Each of your types has at least one constructor: Possibly you overlooked the infix constructor :||: ? Tree a has 2 constructors: Tip and Node SearchCondition has 2 constructors: Term and (:||:) Term a has 1 constructor : Constant *Prelude> :t Tip Tip :: Tree a *Prelude> :t Node Node :: a -> Tree a -> Tree a -> Tree a *Prelude> :t Term True Term True :: SearchCondition *Prelude> :t (:||:) (:||:) :: SearchCondition -> Term Bool -> SearchCondition *Prelude> :t Constant True Constant True :: Term Bool Dan Weston Rahul Kapoor wrote:
Most examples for defining algebraic types include data constructors like so:
data Tree a = Tip | Node a (Tree a) (Tree a)
I by mistake defined a type which did not specify a data constructor :
data SearchCondition = Term Bool | SearchCondition :||: (Term Bool) data Term a = Constant a
sc :: SearchCondition sc = Term True
is ok, but
sc :: SearchCondition sc = Constant True
is not (though this is what I intended to capture!).
So the question is what are types with no constructors good for? A simple example would be appreciated.
Rahul _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe