data X a = X a
は、
template<class T> struct X { X(const T& t) { } };
のような感じ。
date X = forall a. X a
は、
struct X { template<class T> X(const T& t) { } };
のような感じ。
data Num a => X a = X a
は、
template<class Num> struct X { X(const Num& n) { } };
のような感じ。
data X = X (forall a. Num a => a)
は、
struct X { X(const Num& n) { } };
のような感じ。
C++だと制約がうまく表せない場所がありますが(例えば3番目のNumの制約とか)、こんな感じではないかと。