0


シーケンス(有限または無限)を受け取り、同じシーケンスを返す関数をコーディングする必要がありますが、シーケンス中に例外が発生した場合、関数はシーケンスを最初に戻すという唯一の違いがあります。
言い換えると、関数は、終了時に繰り返される循環シーケンスを返す必要があります。ハンドルで例外をキャッチする必要があります。
次の例は機能する必要があります。

  • listToSeq [1,2];
    val it = Cons(1、fn):int seq
  • restartOnError it;
    val it = Cons(1、fn):int seq
  • それを尾行します。
    val it = Cons(2、fn):int seq
  • それを尾行します。
    val it = Cons(1、fn):int seq
  • それを尾行します。
    val it = Cons(2、fn):int seq

誰かが私を助けることができますか?

4

1 に答える 1

1

単純。あなたはCons(int、-> Cons(int、...))のものをたくさん持っていて(それはのように見えます)、そしてあなたは再帰したいと思っています。見て学び、考え抜いてください。リスト内の次のeltを作成するfnを呼び出すときは、まっすぐに呼び出すのではなく、毎回処理し、必要に応じて最初に戻ります。したがって、最初にそのfnを記述します。次に、任意のエルトを新しいリストのエルトに変換するチャップが必要です。次の楽しみを微調整して、最初に戻ることができます。それで、あなたはその男を次に書きます(下の3行目)。最後に、答えを返すだけです。単純なコードは、簡単に理解できる必要があります(擬似コード。コンパイルが完全ではなく、ハスケリズムがある可能性があります)。

fun cycle l =
    let fun handleNext next = ((next()) handle whatever => l);
        fun next (Cons(n, fn)) = Cons(n, fun ()=>next(handleNext fn))
    in next l end;
于 2011-08-30T13:14:18.533 に答える