[Haskell-cafe] Proposal: Sum type branches as extended types (as Type!Constructor)

Gabriel Riba griba2001 at gmail.com
Thu Jun 3 11:14:22 EDT 2010

Extending sum types with data constructors would spare runtime errors or
exception control, 

when applying functions to inappropriate branches, as in the example ...

   data List a = Nil | Cons a (List a)  -- List!Nil and List!Cons 
                                        -- as extended types

* Actual system, with runtime errors (as in GHC Data.List head) or 
exception throwing

   hd :: List a -> a
   hd (Cons x _) -> x
   hd Nil -> error "error: hd: empty list" -- error or exception throwing

* Proposed system extending types with constructors as Type!Constructor:

User must do pattern matching before applying the constructor-specific 
type function.

In ''var @ (Constructor _ _)'' the compiler should append the constructor
to the type as a pair (Type, Constructor) as an extended type for ''var'' 

No need for runtime errors or exception control

   hd :: List!Cons a -> a

   hd (Cons x _) = x

using it:

   headOf :: List a -> Maybe a

   headOf list = case list of

        li @ (Cons _ _) -> Just hd li  -- extTypeOf li == ( 'List', 'Cons')
                                  -- should pass typechecker for List!Cons

        li @ Nil  -> Just hd li     -- compiler error !! 
                                -- extTypeOf ('List','Nil') don't match

        _ -> Just hd list           -- compiler error !! 
                                -- extTypeOf ('List',Nothing) don't match

Maybe we could take out importance on the number of _ wildcards (constructor
arity) with a syntax like.
         li @ (Cons ...)
         li @ (Nil ...)


Gabriel Riba Faura.

More information about the Haskell-Cafe mailing list