
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 | hdaume@isi.edu "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
participants (1)
-
Patty Fong