CleanでDynamicに閉包出来る型の制限について
@eldesh すごい今更ながら,Clean 2.4 Dynamics on Mac(Lion)してみましたが,無事に動きました! ただこの(http://t.co/LARw2jpz)エントリにあるidをリストに入れるとinternal overloading ofとか出ますが
2012-01-06 03:11:11@ranha Linuxでも確認しました。idの型アノテーションが間違ってましたね…。適当な多相じゃない型を指定と通ります(Int->Intとか)。もしくは dynamic id::A.a:a->a とするといけました!
2012-01-07 02:02:09@eldesh dynamicに渡す時に書けばOKで,id::A.a:a->aという型シグネチャでidを定義してもダメなんですかね? うーんどうなってるんでしょ。
2012-01-07 02:16:59@ranha あ、分かりました。LangRep2.2 3.7.4(http://t.co/YcQbxdtq)に書いてあります。全称量化してある最後の引数より手前まででカリー化出来ないのが原因ですね。idをforallにしてしまうとその場で値を渡さないといけなくなります…。
2012-01-07 02:39:31なら id::(A.a:a->a) にすればいいかというと、何故かCleanでは変数と関数が文法上区別され、かつ変数の型にはforallは付けられない感じなので('A`)ヴァー
2012-01-07 02:50:02@eldesh うーん,これ多分関数は関係ないと思います。u = uと定義したuの型シグネチャをu :: aとして、こいつをidの代わりに用いても同様ですね
2012-01-07 02:50:18コンパイルしたら"Run time error, rule 'check_kinds_of_dynamic_info;140' in module 'analtypes' does not match"とかいうし、やってしまった感がある
2012-01-07 02:57:04@ranha A.を付けた場合の話なら先ほど挙げた制限でダメだと思うんですが、A.を付けない多相関数だと普通の型クラスと同じくオーバーロード解決出来ないってことじゃないですかね?
2012-01-07 02:57:17@eldesh ああA.を付けない方の話で大丈夫なんですが、オーバーロード解決ってこの場合だと何の為にどういうタイミングで発生するんですかね
2012-01-07 03:03:32@ranha Dynamicに入れられる型は内部的にはTC型クラスのインスタンスってことになってます。(例えばこんな感じ f :: a -> Dynamic | TC a)なので多相のままだとTCクラスのインスタンスが解決出来ないってことだと思います。
2012-01-07 03:08:35Cleanのoverloading resolutionてGHCのソレとは違うのかなー 例えば class C c where f :: c -> () で instance C a と instance C Int があった時に,f (0 :: Int)がどうなるかというと…
2012-01-07 03:45:15