次の例に示すように、関数を「循環」的に使用したいと思います。
fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);
cll2
これを書き込むと、コンストラクターがバインドされていないというエラーがSMLに生成されます。誰かが私がこれらの線に沿って何かを書くのを手伝ってもらえますか?それはCで可能です。SMLで書きたいのですが。
次の例に示すように、関数を「循環」的に使用したいと思います。
fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);
cll2
これを書き込むと、コンストラクターがバインドされていないというエラーがSMLに生成されます。誰かが私がこれらの線に沿って何かを書くのを手伝ってもらえますか?それはCで可能です。SMLで書きたいのですが。
and
キーワードが欲しい。
fun cll1 s = cll2 s
and cll2 s = cll3 s
and cll3 s = cll s
明らかに、これらの定義は無限再帰であるため機能しません (通常、1 つ以上の関数で基本ケースをテストします) が、それが一般的な形式です。
この場合、 、、および無関係なもの (つまり、関数は実際にはあなたが考えるほど循環的ではない) に依存しているため、次のように書くこともできますcll1
。cll2
cll2
cll3
cll3
fun cll3 (s)= cll(s);
fun cll2 (s)= cll3(s);
fun cll1 (s)= cll2(s);
(もちろん、この場合、すべて同じなのでval (cll1,cll2,cll3) = (cll,cll,cll)
. と書いても構いませんが、それはおそらくあまり意味がありません。)
つまり、これは循環定義とは何の関係もありません。問題を述べたとおりではありません。同じことが起こります
val a = b
val b = 0
(意図が a = b = 0 である場合)。
ここで注意しなければならないのは、c の関数とは異なり、sml の宣言は順番に評価され、まだ宣言していないものを参照したい場合は明示的でなければならないということです。これがand
通常の方法です。 、はい、意味的には、いずれにせよ、一連の関数が互いに参照できるようにまとめられることを示しているためです。