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