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
instance FileIO WrapperType where save f wrap = case wrap of (A obj) = save f obj (B obj) = save f obj */ //** オブジェクト ObjectA の定義 **/
ObjectA =
{ x :: Int , y :: Int } createObjectA x` y` = { x = x`, y = y` } instance FileIO ObjectA //型クラス FileIO の実装 where save f obj # f = fwrites ("(" +++ obj.x-->toString +++ ", " +++ obj.y-->toString +++ ")\n") f = f same obj = obj //** オブジェクト ObjectB の定義 **/
ObjectB =
{ name :: String , value :: String } createObjectB n v = { name = n, value = v } instance FileIO ObjectB //型クラス FileIO の実装 where save :: *File ObjectB -> *File save f obj # f = fwrites ("name=" +++ obj.name +++ "\n" +++ "value=" +++ obj.value +++ "\n") f = f same obj = obj