Functional List in C++
up vote
0
down vote
favorite
This is rather toy example of immutable datatype in C++. I've tried to follow functional languages like Scheme, Racket - making list as a cons cell: list is list or is empty.
/*
* Abstract class
*/
template <class T>
class ImmutableList {
public:
~ImmutableList() {std::cout << "base class destructor";}
virtual bool is_empty() = 0;
virtual T head() = 0;
virtual ImmutableList<T> * tail() = 0;
virtual int length() = 0;
};
/*
* class non empty List
*/
template <class T>
class List: public ImmutableList<T> {
int size = 1;
T first;
ImmutableList<T> * rest;
public:
List(T _first, ImmutableList<T> * _tail){
first = _first;
rest = _tail;
size += _tail->length();
}
~List() {std::cout << "List class destructor";}
bool is_empty() { return false; }
T head(){
return first;
}
ImmutableList<T>* tail(){
return rest;
}
int length() {return size;}
};
/*
* class empty list
*/
template <class T>
class Nil: public ImmutableList<T> {
public:
~Nil();
bool is_empty() {return true;}
int length() {return 0;}
T head() {
throw std::logic_error("Head of empty list!");
}
ImmutableList<T> * tail() {
throw std::logic_error("Tail of empty list!");
}
};
There is more functions, like a reverse, there is also cons function - constructs a list.
Do this really need destructors? Will be better to use smart pointers?
c++ functional-programming interface
add a comment |
up vote
0
down vote
favorite
This is rather toy example of immutable datatype in C++. I've tried to follow functional languages like Scheme, Racket - making list as a cons cell: list is list or is empty.
/*
* Abstract class
*/
template <class T>
class ImmutableList {
public:
~ImmutableList() {std::cout << "base class destructor";}
virtual bool is_empty() = 0;
virtual T head() = 0;
virtual ImmutableList<T> * tail() = 0;
virtual int length() = 0;
};
/*
* class non empty List
*/
template <class T>
class List: public ImmutableList<T> {
int size = 1;
T first;
ImmutableList<T> * rest;
public:
List(T _first, ImmutableList<T> * _tail){
first = _first;
rest = _tail;
size += _tail->length();
}
~List() {std::cout << "List class destructor";}
bool is_empty() { return false; }
T head(){
return first;
}
ImmutableList<T>* tail(){
return rest;
}
int length() {return size;}
};
/*
* class empty list
*/
template <class T>
class Nil: public ImmutableList<T> {
public:
~Nil();
bool is_empty() {return true;}
int length() {return 0;}
T head() {
throw std::logic_error("Head of empty list!");
}
ImmutableList<T> * tail() {
throw std::logic_error("Tail of empty list!");
}
};
There is more functions, like a reverse, there is also cons function - constructs a list.
Do this really need destructors? Will be better to use smart pointers?
c++ functional-programming interface
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
This is rather toy example of immutable datatype in C++. I've tried to follow functional languages like Scheme, Racket - making list as a cons cell: list is list or is empty.
/*
* Abstract class
*/
template <class T>
class ImmutableList {
public:
~ImmutableList() {std::cout << "base class destructor";}
virtual bool is_empty() = 0;
virtual T head() = 0;
virtual ImmutableList<T> * tail() = 0;
virtual int length() = 0;
};
/*
* class non empty List
*/
template <class T>
class List: public ImmutableList<T> {
int size = 1;
T first;
ImmutableList<T> * rest;
public:
List(T _first, ImmutableList<T> * _tail){
first = _first;
rest = _tail;
size += _tail->length();
}
~List() {std::cout << "List class destructor";}
bool is_empty() { return false; }
T head(){
return first;
}
ImmutableList<T>* tail(){
return rest;
}
int length() {return size;}
};
/*
* class empty list
*/
template <class T>
class Nil: public ImmutableList<T> {
public:
~Nil();
bool is_empty() {return true;}
int length() {return 0;}
T head() {
throw std::logic_error("Head of empty list!");
}
ImmutableList<T> * tail() {
throw std::logic_error("Tail of empty list!");
}
};
There is more functions, like a reverse, there is also cons function - constructs a list.
Do this really need destructors? Will be better to use smart pointers?
c++ functional-programming interface
This is rather toy example of immutable datatype in C++. I've tried to follow functional languages like Scheme, Racket - making list as a cons cell: list is list or is empty.
/*
* Abstract class
*/
template <class T>
class ImmutableList {
public:
~ImmutableList() {std::cout << "base class destructor";}
virtual bool is_empty() = 0;
virtual T head() = 0;
virtual ImmutableList<T> * tail() = 0;
virtual int length() = 0;
};
/*
* class non empty List
*/
template <class T>
class List: public ImmutableList<T> {
int size = 1;
T first;
ImmutableList<T> * rest;
public:
List(T _first, ImmutableList<T> * _tail){
first = _first;
rest = _tail;
size += _tail->length();
}
~List() {std::cout << "List class destructor";}
bool is_empty() { return false; }
T head(){
return first;
}
ImmutableList<T>* tail(){
return rest;
}
int length() {return size;}
};
/*
* class empty list
*/
template <class T>
class Nil: public ImmutableList<T> {
public:
~Nil();
bool is_empty() {return true;}
int length() {return 0;}
T head() {
throw std::logic_error("Head of empty list!");
}
ImmutableList<T> * tail() {
throw std::logic_error("Tail of empty list!");
}
};
There is more functions, like a reverse, there is also cons function - constructs a list.
Do this really need destructors? Will be better to use smart pointers?
c++ functional-programming interface
c++ functional-programming interface
asked 18 mins ago
Robert Hanigan
10510
10510
add a comment |
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f208357%2ffunctional-list-in-c%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown