Exported Concept Maps vs TypeClass

はじめてデフォルト実装が記述できることを知りました.ConceptGCCで対応してたかな?
でそれをさらに便利にする提案.
commitee documents Exported Concept Map
conceptで提供するデフォルト実装を暗黙で提供する話.

concept LessThanComparable< typename T >
{
    bool operator<(T const& x, T const& y);
    bool operator>(T const& x, T const& y) { return y < x; }
    bool operator<=(T const& x, T const& y) { return !(y < x); }
    bool operator>=(T const& x, T const& y) { return !(x < y); }
}

template< LessThanComparable T >	// ここで要求しとけば
bool f(T & x, T & y){
	return y < x;			// これがデフォルトで提供される.だったけど...
}

export concept_map LessThanComparable<Num> { }; // もうこれがあれば,

bool f(Num & x, Num & y){
	return y < x;				// ここも勝手に提供しちゃう
}

これが以下と対応する.

class LessThanComparable a
where
	(<)  infix 2:: a a -> Bool

	(>)  infix 2:: a a -> Bool
	(>)  x y :== y < x

	(<=) infix 2:: a a -> Bool
	(<=) x y :== not (y < x)
	
	(>=) infix 2:: a a -> Bool
	(>=) x y :== not (x < y)

f:: Num Num -> Bool | LessThanComparable Num // こんなん書かなくても

f:: Num Num -> Bool	// これだけで
f x y = y < x		// 推論してくれます.

と対応する.*1

当初理解してた自分の理解と微妙に合わない気もする.
実装して無いのに実行されちゃう(コンパイル通っちゃう)とかconceptの目的からしていいのか?

これ実装されるといよいよHaskellっぽくなってくるな(Haskell知らんけど)
なんか無茶な…いいぞもっとやれw*2

*1:なんてニッチ向け説明だw

*2:やってもいいけどexportって単語には拒否反応が…