2

次の例に示すように、関数を「循環」的に使用したいと思います。

fun cll1 (s)= cll2(s);
fun cll2 (s)= cll3(s);
fun cll3 (s)= cll(s);

cll2これを書き込むと、コンストラクターがバインドされていないというエラーがSMLに生成されます。誰かが私がこれらの線に沿って何かを書くのを手伝ってもらえますか?それはCで可能です。SMLで書きたいのですが。

4

2 に答える 2

8

andキーワードが欲しい。

fun cll1 s = cll2 s
and cll2 s = cll3 s
and cll3 s = cll s

明らかに、これらの定義は無限再帰であるため機能しません (通常、1 つ以上の関数で基本ケースをテストします) が、それが一般的な形式です。

于 2011-02-22T19:24:06.480 に答える
0

この場合、 、、および無関係なもの (つまり、関数は実際にはあなたが考えるほど循環的ではない) に依存しているため、次のように書くこともできますcll1cll2cll2cll3cll3

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通常の方法です。 、はい、意味的には、いずれにせよ、一連の関数が互いに参照できるようにまとめられることを示しているためです。

于 2012-11-26T01:40:54.687 に答える