5

不自然な例:

signature A =
sig
  type t
  val x: t
end

signature B =
sig
  type t
  val y: t
end

signature C = sig include A B end

明らかに、これはでtype t2回発生する苦情を引き起こしCます。tしかし、2つを同等にして、最終的に次のようにしたいと表現する方法はありますか。

signature C =
sig
  type t
  val x: t
  val y: t
end

のようなあらゆる種類のばかげた構文を試しinclude B where type t = A.tましたが、当然のことながら機能しませんでした。試し忘れたことはありますか?

また、これは言語の構文に明らかな(または欠如している)ものがないかチェックすることで簡単に答えられることを知っていますが、インターネット上のどこにも完全な文法を見つけることができませんでした。

(FWIW、私がこれをやろうとしている実際の理由は、Haskellスタイルのモナドなどです。ここで、aはaとMonadPlusaの単なる混合です。現時点では、inの内容を繰り返しているだけです。理想よりも。)MonadAlternativeALTERNATIVEMONAD_PLUS

4

2 に答える 2

2

共有句を探しています。

signature C =
sig
  structure A1 : A
  structure B1 : B
  sharing type A1.t = B1.t
  type t = A1.t
  val z : t
end

これにより、A1のtとB1のtが同じになり、さらに値zのタイプと同じtが使用されます。

StandardML'97の文法はこちらから入手できます。

于 2010-06-06T01:07:47.410 に答える
2

あなたはうんざりしています。あなたができる最善の方法は、ジョーダン・ルイスが示唆するように、部分構造と共有節を使用することです。include両方が定義する 2 つの異なる署名に対してはt、常にエラーになります。そのため、好きなように混ぜALTERNATIVEMONAD_PLUSもうまくいきません。

includeその他の問題点とその修正方法の提案については、 An Expressionive Language of Signaturesを参照してください。

于 2010-06-06T01:27:17.510 に答える