fstclassmod遊び1

0
Üe🦀 @ranha

こうしれっとis_empty_が書けなくて晩ご飯に行けないですよ... http://d.hatena.ne.jp/ranha/20101107/1289129831

2010-11-07 20:37:30
病気の美少女 @lyrical_logical

多相的な is_empty は無理でしょう。Functor だけだとできそうな気がするけれど、結局 Map.S.t の詳細はもずーるさんしか知らないわけで、Map.Make(String) と Map.Make(Int32) さんの二人だけの世界に OreoreMap がきて破局

2010-11-08 01:47:15
病気の美少女 @lyrical_logical

あるファンクタから作られたモジュールであることを表すシグネチャが存在すれば二人だけの世界を実現することはできるけれどそれはなんかできそうにないなあ・・・

2010-11-08 01:52:40
Üe🦀 @ranha

@lyrical_logical caml-3.12-refman.pdfのp146 Advanced examplesを見る限りだと出来ても良い気がするんだけどなー

2010-11-08 02:02:27
Üe🦀 @ranha

caml-3.12じゃなくてocaml-3.12-refman.pdf

2010-11-08 02:02:47
病気の美少女 @lyrical_logical

結局 Map.Make(M).t は Ord とかどうでもいいの心があるので、functor_impl_t を作って、ファンクタが作るモジュールを表すシグネチャを Make.S を with t := functor_impl_type とかやって・・・

2010-11-08 02:05:42
Üe🦀 @ranha

"Explicit naming of type variables"でcaptureした型をMap.S.'a tにぶち込んで、そのcaptureした型を使えばローカルモジュールの逃亡はしてないように騙せるんじゃないかと思ったけどどうやってMap.S.tをすり替えれば良いんだ

2010-11-08 02:08:30
病気の美少女 @lyrical_logical

@ranha そういわれて考え直した結果、つまり Modl.t を関数さんに教えてやればいいだけじゃんってなって scoped type variables と with つかったら different arities っていわれてそして arity = 1 な

2010-11-08 02:14:36
Üe🦀 @ranha

@lyrical_logical そこどうしたらええんやって話で喉痛いんですよ

2010-11-08 02:16:13
病気の美少女 @lyrical_logical

@ranha Signature with [type|module] = name でいいはずなんだけれど、途切れてる発言のとおり型変数持った型にたいする適用の書き方がわからない。

2010-11-08 02:16:47
Üe🦀 @ranha

package-type-constraint ::= type typeconstr-name = typexpr で typeconstr-nameがlowercase-identみたいな感じだからどうかんがえても type ('a t) = nanka とかはDEATH

2010-11-08 02:18:04
病気の美少女 @lyrical_logical

@ranha parser.mly みた感じもそんな感じらしい。ocaml 終わったな・・・

2010-11-08 02:22:24
病気の美少女 @lyrical_logical

要約すると、引数にモジュールを含む関数で、モジュールに含まれる型変数を持つ型に関する制約を書くことはできないってことか。これは技術的にできないのか、なんなのか・・・

2010-11-08 02:30:38
病気の美少女 @lyrical_logical

別に型変数持つ型の場合も普通にできていい気がするので、すごく眠い、大変な時間になってるな・・・

2010-11-08 02:31:52
Üe🦀 @ranha

@lyrical_logical やはりというか、Obj.magic使ってまぁ実装出来たわけですが(http://d.hatena.ne.jp/ranha/20101107/1289129831) mapの型が単に'aになっててクソ過ぎて使えないですよねぇ…

2010-11-08 03:27:10
Keigo Imai @keigoi

@ranha おもしろそうなことやってますね。 http://ideone.com/kTgED としてみたんだけど type t が型コンストラクタなのでこのままでは駄目ですね…

2010-11-08 08:19:59
Üe🦀 @ranha

@keigoi Explicit naming of type variablesを使うと、そこで詰まってしまうんですよね。package-type-constraintを型コンストラクタに対して付けてはいけない場合があるから入ってないのかなーと考えてみてるんですが

2010-11-08 08:23:34
Üe🦀 @ranha

色々迂回させてみようとしてみてますけど、どれも上手く書けてません!! type ('a , 'b) aux = Aux of ((module Map.S with type key = 'a) * 'b (同じの).t)とかもダメですし

2010-11-08 08:26:14
Keigo Imai @keigoi

@ranha 型コンストラクタにについてもpackage type constraintは付けられるはずなんだけど、なぜか first class module ではうまくいかない…

2010-11-08 08:27:25
Keigo Imai @keigoi

@ranha trunkに implicit-unpackがマージされたとの事なので、そっちで試してみては?

2010-11-08 08:42:07
Keigo Imai @keigoi

@ranha あっごめんなさい、 frisch : These extensions might not play so well with with-constraints extended on parametrized types. …とあるので駄目っぽいですね

2010-11-08 08:45:19
Üe🦀 @ranha

取りあえずfrischさんブランチでfstclassmod_parametrizedというのがあるので、そっちをmakeしてみます。一発で通れば良いですけど.

2010-11-08 08:50:22
Keigo Imai @keigoi

trunkで試しましたが(もちろん)駄目でした…

2010-11-08 08:57:34
Keigo Imai @keigoi

しかしimplicit-unpack超便利! let module無くてスッキリ module type S = sig type t val v : t end let ext = fun (type s) (module M : S with type t=s) -> M.v

2010-11-08 09:01:00