アキュムレータ
さて、あなたはほとんどそこにいます-最初に、オリジナルには2つの引数があることを覚えているかもしれませんf
-したがって、おそらく別の引数を追加する必要があります:
let fA i xs = ...
その後、元の変更i
が進むにつれて、あなたもそうすべきです(ループに追加してください):
let fA i xs =
let rec loop i acc = function
それからあなたはほとんどそこにいます-loop
正しい引数で呼び出す必要があり、おそらく順序の問題があります...試し続けてください:D
ああ、そうです-@Sehnsuchtが言ったように-どこかに を入れる必要がi+1
あります...よく覚えておいi
てくださいloop
...
次のヒント
acc
ほとんど何も変更されていないことがわかります。
let fA i xs =
let rec loop i acc = function
| ???
| x::xs -> loop (???) (???::acc) xs
???
明らかに、場所に(異なる)ものを挿入する必要があります???
:D
それでも問題が解決しない場合は、次のようなコンパイル バージョンを入手できます。
let fA i xs =
let rec loop i acc = function
| [] -> acc
| x::xs -> loop i (x::acc) xs
loop i [] xs
もちろん、これは正しく機能しませんが、何かが始まります
継続
あなたはおそらくそれを推測しました-アキュムレータベースから継続ベースへの方法はそれほど違いはありません(実際、これはより簡単かもしれません-あなたが後方思考にどれだけ慣れているかによって異なります):
次からやり直します。
let fC i xs =
let rec loop i cont = function
問題が発生した場合は、コンパイラに少し手伝ってもらう必要があるかもしれません。そのためには、次のcont
ように型を追加します。
let fC i xs =
let rec loop i (cont : int list -> int list) = function
ここで、新しい継続を作成する必要があることを思い出してください。新しい継続(fun res -> ...something... |> cont)
として渡すようなものです。リストの残りの部分(あなたの)で私res
のことをした結果と考えれば、それは簡単なはずです。xs
最初の継続では、おそらく何もしたくないでしょう...しかし、これはほとんどの場合同じなので、すぐにわかるでしょう。
あなたの先生がつけたいくつかの卑劣なポイント
- これ
[] -> [i]
は厄介な場合があります...そして、はい、あなたは今それを見逃していました;) - 何かをコンパイルすると(最初の関心事になるはずです)、すぐにそれを理解できると思います
i+x
そしてi+1
...混ぜないで忘れないでください;)
PS:宿題をあまり台無しにしたくありません-後でこれを完全な回答にします-しかし、1つのコメントIMOでは多すぎて読めませんでした