[Haskell-beginners] Maybe and Just
Larry Evans
cppljevans at suddenlink.net
Fri Mar 27 19:57:00 UTC 2015
On 03/27/2015 02:01 PM, Joel Neely wrote:
> Shishir,
>
> Would I be right to guess that you're coming from an OO background? If
> so, I'd suggest thinking about the difference between declaring a
> constructor and invoking it.
>
> I suggest that you can read the Haskell declaration
>
> data Maybe tp = Just tp | Nothing
>
>
> as declaring a data type and specifying two constructors that can
> return an instance (in the OO sense of the word) of that data type. But
> when the expression
>
> Just "FOO"
>
>
> is invoking one of those constructors on a value of type String, so the
> resulting value has type Maybe String.
>
[snip]
Or, Maybe can be thought of as an abstract class with concrete
subclasses, Just and Nothing.
Or, Maybe can be thought of like a tagged union. In c++ syntax:
enum MaybeTag{ JustTag, NothingTag};
template<typename ValType>
struct JustType
{
ValType my_val;
JustType(ValType a_val)
: my_val(a_val)
{}
};
struct NothingType
{};
template<typename ValType>
struct Maybe
{
private:
MaybeTag
my_tag;
union possible_values
{ JustType<ValType> just_val;
NothingType nothing_val;
possible_values(ValType a_val)
: just_val(a_val)
{}
possible_values()
: nothing_val()
{}
}
my_val;
Maybe(ValType a_val)
: my_tag(JustTag)
, my_val(a_val)
{
}
Maybe()
: my_tag(NothingTag)
, my_val()
{}
public:
MaybeTag
tag()const
{ return my_tag;
}
static Maybe<ValType>
Just(ValType a_val)
{ return Maybe<ValType>(a_val);
}
static Maybe<ValType>
Nothing()
{ return Maybe<ValType>();
}
};
#include <iostream>
int main()
{
auto mj=Maybe<int>::Just(5);
std::cout<<"mj.tag="<<mj.tag()<<"\n";
auto mn=Maybe<int>::Nothing();
std::cout<<"mn.tag="<<mn.tag()<<"\n";
return 0;
}
The following is the compile and run of above code:
g++ -std=c++11 tagged_union.cpp -o tagged_union.exe
./tagged_union.exe
mj.tag=0
mn.tag=1
More information about the Beginners
mailing list