<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
I am learning Haskell and have set a small exercise for myself on a
frames and slots program. <br>
Would appreciate some help on how to pass constructors of data
structures as arguments to a function. <br>
<br>
Thanks,<br>
<br>
-- Ralph<br>
__________<br>
<br>
<div class="moz-text-flowed"
 style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">A
Frames test
<br>
<br>
&gt; module Frames
<br>
&gt; where&nbsp;
<br>
<br>
Define frame slots:
<br>
<br>
&gt; type FirstName = String&nbsp;&nbsp;&nbsp;&nbsp; -- first name
<br>
&gt; type LastName&nbsp;&nbsp;&nbsp; = String&nbsp;&nbsp; -- last name
<br>
&gt; type Organization = String
<br>
&gt; type Email = String
<br>
&gt; type WorkPhone = String
<br>
&gt; type CellPhone = String
<br>
&gt; type TelephoneNumber = String
<br>
<br>
Define slots for a contact
<br>
<br>
&gt; data ContactProperty = FN FirstName
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | LN LastName
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | OR Organization
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | EM Email
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | WP TelephoneNumber
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | MP TelephoneNumber
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; deriving (Show, Eq)
<br>
<br>
&gt; data Contact = Contact [ContactProperty]
<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; deriving (Show, Eq)
<br>
<br>
&gt; type Contacts = [ Contact]
<br>
<br>
Now I need a way to extract properties from the frame. Start by testing
pattern matching
<br>
without using parameters. Then I need to find out how to pass a
constructor as a parameter.
<br>
<br>
&gt; getProperty:: [ContactProperty] -&gt; FirstName
<br>
&gt; getProperty ((FN fn):_) = fn
<br>
&gt; getProperty&nbsp;&nbsp;&nbsp;&nbsp; (_:xs)&nbsp; = getProperty xs
<br>
&gt; getProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [] = "unknown"
<br>
<br>
&gt; firstName:: Contact -&gt; FirstName
<br>
&gt; firstName (Contact cpl) = getProperty cpl
<br>
<br>
<br>
Define Contacts
<br>
<br>
&gt; c1::Contacts
<br>
&gt; c1 =
<br>
&gt;&nbsp; [ ( Contact&nbsp; [(FN "Ralph"),(LN "Hodgson"),(OR "TopQuadrant"),(EM <a
 class="moz-txt-link-rfc2396E" href="mailto:rhodgson@topquadrant.com">"rhodgson@topquadrant.com"</a>)]),
<br>
&gt;&nbsp;&nbsp;&nbsp; ( Contact&nbsp; [(FN "Mills"),(LN "Davis"),(EM <a
 class="moz-txt-link-rfc2396E" href="mailto:mdavis@project10x.com">"mdavis@project10x.com"</a>)])]
<br>
<br>
Tests
<br>
<br>
&gt; t1=firstName $ head c1 -- should be "Ralph"
<br>
&gt; t2=firstName $ last c1 -- should be "Mills"
<br>
___________________________
<br>
<span class="moz-txt-tag"></span><br>
<div class="moz-txt-sig"><br>
<br>
<br>
<br>
</div>
</div>
<br>
</body>
</html>