Another prompt reply! thanks Hal :) I think I understand this correctly now

For my previous problem which was:
<prolog> ::= (<assertion> ".")*
<assertion> :: = <structure> | <rule>
<rule> ::= <structure> ":-" <structure>("," <structure>)*
<structure> ::= <name> [�(� <term> (�,� <term>)* �)�]
<term> ::= <number> | <variable> | <structure>
<variable> ::= <name>

Does this appear to be correct:
type Prolog = [Assertion]
data Assertion = StrucAssert Structure | RuleAssert Rule
data Rule = Rule Structure Structure [Structure]
data Structure = Structure Name Term [Term]
data Term = NumTerm Number | VarTerm Variable | StrucTerm Structure
type Variable = Name
type Name = String
type Number = Int

From: Hal Daume III To: Patty Fong CC: Haskell Cafe , Hal Daume Subject: Re: Data types basics Date: Tue, 4 Nov 2003 22:10:03 -0800 (PST)

Hi again,

On Wed, 5 Nov 2003, Patty Fong wrote:

> Hi to anyone reading this. i'm still strugling a bit with data type > declarations. > > The was i understand it is that if i delcare a new data type: > > data myType = myType a | b | c

This isn't entirely correct. The names of types have to begin with capital letters, as do constructors (more later). So you would need this to be:

data MyType = MyType A | B | C

where A is an existing type.

This type now has three constructors:

MyType :: A -> MyType B :: MyType C :: MyType

It's perhaps a bit easier to understand when the names are different.

When we say:

data Foo = Bar Int | Baz String

this means that a "Foo" is of one of two forms (the "|" can be read as disjunction). A value of type Foo is either of the form "Bar x" for some x which is an Int or "Baz y" for some y which is a String.

"Bar" and "Baz" are called "constructors" because they take arguments and "construct" a Foo. So, in this case,

Bar :: Int -> Foo Baz :: String -> Foo

are the two constructors.

Of course, you have have any number of constructors and each can have any number of arguments.

data Foo = Bar | Baz Int | Bazaa String Bool

Now there are three constructors:

Bar :: Foo Baz :: Int -> Foo Bazaa :: String -> Bool -> Foo

they can be recursive:

data Foo = Bar | Baz Int Foo

Bar :: Foo Baz :: Int -> Foo -> Foo

and can have "type variables", for instance:

data Foo a = Bar | Baz a

here, something of type "Foo a" is either of the form Bar or of the form Baz x for some x which is of type a. This has constructors:

Bar :: Foo a Baz :: a -> Foo a

I hope this sheds some light on the issue...


--
Hal Daume III | [EMAIL PROTECTED] "Arrest this man, he talks in maths." | www.isi.edu/~hdaume



_________________________________________________________________
Hot chart ringtones and polyphonics. Go to http://ninemsn.com.au/mobilemania/default.asp


_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to