0

リスト内のいくつかの要素を上書きすると実際に機能することを期待して、以下の関数を宣言しました.しかし、これが正しい方法であるかどうかは完全にはわかりません.私のものとは異なるアイデアは高く評価されます.

fun  foo (ls,n) =if ls = nil then nil else ( rev ( 1::List.rev ( List.take (ls,n-1 ))))@(List.drop (ls,n)

このように動作するはずです

foo ([0,3,9],2) = [0,1,9]
4

2 に答える 2

0

あなたはそこで多くの不必要な仕事をしています。takedroprevおよび@すべてリストをトラバースする必要があります。これを 5 回実行することになりますが、1 回だけ実行する必要があります。Jeffreyが指摘したように、 の結果に を追加するだけで呼び出しをなくすことができますが、まだ改善revの余地があります。1drop

Listライブラリ内の何にも依存しない独自の再帰関数を作成してみてください。関数型プログラミングでどこにでも到達するには、再帰的思考を直感的に理解する必要があります。一連の呼び出しは次のようになります。

  foo ([a,b,c,d], 4)
= a :: foo([b,c,d], 3)
= a :: b :: foo([c,d], 2) ...
于 2013-11-07T00:46:32.703 に答える