Concurrent Clean と 多態性
先日から、かなりあれこれと試行錯誤をしてみたのですが、結局Cleanのシステムでは、型クラスを用いて多態性を実現することは不可能であるようだという結論に至りました。動作したのは、ラッパー型を作成した場合ですが、これは汎用性の面で欠けるし、それ以外は動作しなかったのです。
おそらく、現行のCleanのシステムでは、Cと同じように、構造体に関数ポインタをセットするようなやり方を取る必要があるのでしょう。
試行錯誤に使ったソース
module poly import StdEnv import StdDynamic Start:: *World -> *World Start w # (f, w) = stdio w # objAlist = [obj1, obj4] # f = foldl save f objAlist # objBlist = [obj2, obj3] # f = foldl save f objBlist //# objlist = [A obj1, B obj2, B obj3, A obj4] //# objlist = [dynamic obj1, dynamic obj2, dynamic obj3, dynamic obj4] //# f = foldl dSave f objlist # f = doSave f obj1 5 # lst = doList [] obj1 # lst = doList lst obj2 # f = foldl save f lst # (_, w) = fclose f w = w where obj1 = createObjectA 1 2 obj2 = createObjectB "person" "peter" obj3 = createObjectB "company" "kaisya" obj4 = createObjectA 5 3 //**オブジェクト指向の矢型演算子 (-->) infixl 9 :: a (a -> b) -> b (-->) a f = f a //** 型クラス = インターフェース の定義 **/ class FileIO a where save :: *File a -> *File same :: a -> a //** ラッパーオブジェクト **/ doSave :: *File a Int -> *File | FileIO a doSave f obj 0 = f doSave f obj n # f = save f obj = doSave f obj (n-1) doList :: [a] a -> [a] | FileIO a doList xs x = [x:xs] /* unbind :: Dynamic -> a | TC a unbind (x :: a^) = x unbind x = abort "error" dSave:: *File Dynamic -> *File dSave f obj = dSave` f (unbind obj) where dSave` f */ /*
- WrapperType = A ObjectA | B ObjectB
- ObjectA =
- ObjectB =