7

「Erlang Programming」には、次の index 関数があります。

index(0, [X|_]) -> X;
index(N, [_|Xs]) when N>0 -> index(N-1, Xs)

パターンマッチングのせいで「N>0のとき」ガードが余計じゃないですか?index(0, List) の呼び出しは 2 番目の句に終わらないため、N は常に > 0 になります。または、ここで完全に間違っていますか?

4

3 に答える 3

12

この関数は、N>=0 に対して正しく機能します。ガードがない場合、N<0 の場合、リスト全体をトラバースします。

index(-2,[1,2,3]) -> index(-3,[2,3]) -> ... -> index(-5,[]) -> エラー。

これは大きな問題ではありませんが、紛らわしい例外が発生する可能性があるだけです。無限リストを持つ言語 (Haskell、Ocaml) では、そのガードを忘れると、無限ループ (index(-1, [0,0,0..])) につながる可能性があります。

于 2010-08-08T15:35:00.420 に答える
6

when 句は、負のインデックスから保護します (編集: 元の質問へのコメントを参照してください;)。

于 2010-08-08T15:23:11.580 に答える
5

また、デフォルトだけでなく、この句が有効な場合に明示的に言うように、より明確なコードも提供します。はい、一部の (多くの) ケースでは、テストが非常に複雑になるか、何らかの形式のデフォルト ケースが必要なため、これを適切に行うことができないことはわかっています。しかし、ここではありません。

于 2010-08-09T01:00:57.177 に答える