Functor引数として受け取った構造体の一部であるデータ型のコンストラクタをStandard MLで再エクスポートすることは可能ですか?Standard MLのfunctor引数からデータ型を再エクスポートする方法
signature FLAG =
sig
type t
end
signature MEMBER =
sig
structure Flag : FLAG
end
functor Member(F : FLAG) : MEMBER =
struct
structure Flag = F
end
structure M =
Member(struct
datatype t =
FLAG_1
| FLAG_2
end)
val flag1 = M.Flag.FLAG_1;
(* Error: unbound variable or constructor: FLAG_1 in path M.Flag.FLAG_1 *)
上記の例では、実用的な意味の任意の並べ替えをしないかもしれないが、それは私が私のプロジェクトの一つに遭遇した問題のほんの骨抜きバージョンです:いくつかのコードは、おそらく簡単にこれを理解するために行います。
ありがとう:私たちは、あなたが以下のプログラムで数子を使用していたときに観測され、同じ動作を得ます。あなたはまったく正しい。私は自分のプロジェクトに夢中になり、タイプが署名に指定されないままになったときにいつも起こるという事実を逃しました。私の特別なケースでは、2つの異なる 'datatype'宣言を持つ2つの異なる' FLAG'構造体を持っているので、実際には署名を定義することはできません。再度、感謝します。 –
私は(希望!)あなたのケースが達成できるはずだと思います!たぶん 'where'の正しい使い方ですか? SMLモジュールシステムは、私が暴露してきた最も刺激的なPL構造の1つですが、多くの場合、多くの方向で制限があり、モジュールシステムが私の望むものではないことを明らかにする障害に遭遇します。私はまだ、どの部分が言語実装によって課せられた制限であるのか、どの部分がうまく形成され、論理的に正しいのか厳しい限界であるのかを把握しようとしています。 –
mixinパターンと呼ばれるパターンを使用して回避することができました。ここでは、単に「ファンクタ」呼び出しの結果を開くだけです。 https://gist.github.com/igstan/c566eecc38784216f1499bfe8d91f4c4 –