Concurrent Clean : ++を型クラスで置き換えてみたら・・・

++がリスト型専用の演算になっているので、型クラスで置き換えたライブラリを作ってみている。

class (++) infixr 5 q a :: !(q a) (q a) -> q a

という宣言にすると、リストの++を行うのに型コンテキストが必要になってしまった。

class (++) infixr 5 q :: !q q -> q

ならば、型コンテキストなしでよいのだけれど、文字列も同じ演算を使えるようにしようとするとこれだとよくないのは前に書いたとおり。

      • -

しかし、これはきつい。
+++を文字列専用として割り切って、++の型クラスの宣言を後者の方にするのが妥当かもしれない。

      • -

_SystemStrictListsの定義の仕方だとうまくいく。
もう少し調査が必要。

      • -

これは

(!!|) infixl 9 :: !u:(l v:e) !Int -> v:e | List l e,[u<=v]
	special
		l=[]; l=[!]; l=[ !]; l=[!!]
		l=[#],e=Int ; l=[#!],e=Int
		l=[#],e=Char; l=[#!],e=Char
		l=[#],e=Real; l=[#!],e=Real

という定義になっていて、今回は [!!] を使っていたため、型コンテキストなしでも特化関数が選択されたため。