[Haskell-cafe] Passing Constructors as arguments

Pierre Barbier de Reuille pierre.barbier at cirad.fr
Wed Apr 13 10:58:48 EDT 2005


I don't really understand what you want to achieve : constructors are 
functions, thus first class objects ...

I suppose you want a destructor, ie a function extracting the first name 
from a property for example. You may want to have a look there :

http://haskell.org/hawiki/DecoratingStructures

Pierre

Ralph Hodgson a écrit :
> I am learning Haskell and have set a small exercise for myself on a 
> frames and slots program.
> Would appreciate some help on how to pass constructors of data 
> structures as arguments to a function.
> 
> Thanks,
> 
> -- Ralph
> __________
> 
> A Frames test
> 
>  > module Frames
>  > where
> Define frame slots:
> 
>  > type FirstName = String     -- first name
>  > type LastName    = String   -- last name
>  > type Organization = String
>  > type Email = String
>  > type WorkPhone = String
>  > type CellPhone = String
>  > type TelephoneNumber = String
> 
> Define slots for a contact
> 
>  > data ContactProperty = FN FirstName
>  >           | LN LastName
>  >           | OR Organization
>  >           | EM Email
>  >           | WP TelephoneNumber
>  >           | MP TelephoneNumber
>  >     deriving (Show, Eq)
> 
>  > data Contact = Contact [ContactProperty]
>  >     deriving (Show, Eq)
> 
>  > type Contacts = [ Contact]
> 
> Now I need a way to extract properties from the frame. Start by testing 
> pattern matching
> without using parameters. Then I need to find out how to pass a 
> constructor as a parameter.
> 
>  > getProperty:: [ContactProperty] -> FirstName
>  > getProperty ((FN fn):_) = fn
>  > getProperty     (_:xs)  = getProperty xs
>  > getProperty          [] = "unknown"
> 
>  > firstName:: Contact -> FirstNamen
>  > firstName (Contact cpl) = getProperty cpl
> 
> 
> Define Contacts
> 
>  > c1::Contacts
>  > c1 =
>  >  [ ( Contact  [(FN "Ralph"),(LN "Hodgson"),(OR "TopQuadrant"),(EM 
> "rhodgson at topquadrant.com")]),
>  >    ( Contact  [(FN "Mills"),(LN "Davis"),(EM "mdavis at project10x.com")])]
> 
> Tests
> 
>  > t1=firstName $ head c1 -- should be "Ralph"
>  > t2=firstName $ last c1 -- should be "Mills"
> ___________________________
> 
> 
> 
> 
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

-- 
Pierre Barbier de Reuille

INRA - UMR Cirad/Inra/Cnrs/Univ.MontpellierII AMAP
Botanique et Bio-informatique de l'Architecture des Plantes
TA40/PSII, Boulevard de la Lironde
34398 MONTPELLIER CEDEX 5, France

tel   : (33) 4 67 61 65 77    fax   : (33) 4 67 61 56 68


More information about the Haskell-Cafe mailing list