What exactly is Node? is it a keyword? a data type? I can't figure out how it works.
If if define this, for example
data Seq a = Empty | Node a (Seq a)
Am I saying there is a variable a with the type Node, am I defining a new type, what is it exactly?
() is very often used as the result of something that has no interesting result. For example, an IO action that is supposed to perform some I/O and terminate without producing a result will typically have type IO () .
Data constructors are first class values in Haskell and actually have a type. For instance, the type of the Left constructor of the Either data type is: Left :: a -> Either a b. As first class values, they may be passed to functions, held in a list, be data elements of other algebraic data types and so forth.
The Haskell standard data type Maybe is typically declared as: data Maybe a = Just a | Nothing. What this means is that the type Maybe has one type variable, represented by the a and two constructors Just and Nothing. (Note that Haskell requires type names and constructor names to begin with an uppercase letter).
The Either type is sometimes used to represent a value which is either correct or an error; by convention, the Left constructor is used to hold an error value and the Right constructor is used to hold a correct value (mnemonic: "right" also means "correct").
Can Haskell provide some of the benefits of Node.js, namely a clean solution to avoid blocking I/O without having recourse to multi-thread programming? Yes, in fact events and threads are unified in Haskell. You can program in explicit lightweight threads (e.g. millions of threads on a single laptop).
If you want to dig deeper into the Haskell type system: a data or value constructor has a type, e.g., Node 3 Tip Tip has type Tree Int; a type of a type constructor itself is called kind.
But Tree by itself is a type constructor, and as such takes a type as an argument and returns a type as a result. There are no values in Haskell that have this type, but such "higher-order" types can be used in classdeclarations.
Each of them have type Tree a, naturally. Data constructors are first class values in Haskell and actually have a type. For instance, the type of the Left constructor of the Either data type is: As first class values, they may be passed to functions, held in a list, be data elements of other algebraic data types and so forth.
As the comment states, Node
is a data constructor. This means it's a possible way of constructing a value of type Seq a
(where a
represents another type).
This particular data structure represents a sequence, which can be constructed either using the Empty
data constructor or with the Node
one.
For example:
empty :: Seq a
empty = Empty
seqOf1Int :: Seq Int
seqOf1Int = Node 5 Empty
seqOf2Strings :: Seq String
seqOf2Strings = Node "hello" (Node "world" Empty)
In this case, Empty
and Node
are data constructors [Haskell wiki]. Each value with type Seq a
is either an Empty
, or a Node
that wraps two parameters: the first one of type a
, and the other one a Seq a
value.
One can thus construct values with arbitrary size in this case, for example Empty
, Node 1 Empty
, Node 1 (Node 4 Empty)
, etc. Therefore you definition looks like the definition of a list []
, which is implemented as a linked list in Haskell.
You can use data constructors as functions where they take parameters for the parameters, so Node
can be used as a function Node :: a -> Seq a -> Seq a
.
Data constructors are also used to pattern match. For example you can implement a function:
seqSize :: Seq a -> Int
seqSize Empty = 0
seqSize (Node _ xs) = 1 + seqSize xs
here it will thus pattern match and in case the value is an Empty
it will return zero. For a Node
the variable xs
refers to the second parameter of the value (so also of type Seq a
) that can then be used in the recursive call.
In general, Node
is an identifier starting with a capital letter, which means that it's a valid name for type and data constructors.
In this specific code you're defining it as a data constructor that takes two arguments of types a
and Seq a
respectively and which belongs to the type Seq a
.
data Seq a = Empty | Node a (Seq a)
is a data type definition where Seq a
is the type and Empty
and Node a (Seq a)
are its constructors.
Node
is a recursive constructor. It has a value of type a
that it receives as a parameter on construction. The second parameter to Node
is of type Seq a
which is the type of Node
itself, thus it becomes a recursive data structure. Seq a
that is passed as a parameter to Node
can be constructed with any of Seq
s constructors, namely Empty
and Node
. Empty
closes the recursive data structure as it doesn't receive itself any new parameters of type Seq a
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With