「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 になります。または、ここで完全に間違っていますか?
「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 になります。または、ここで完全に間違っていますか?
この関数は、N>=0 に対して正しく機能します。ガードがない場合、N<0 の場合、リスト全体をトラバースします。
index(-2,[1,2,3]) -> index(-3,[2,3]) -> ... -> index(-5,[]) -> エラー。
これは大きな問題ではありませんが、紛らわしい例外が発生する可能性があるだけです。無限リストを持つ言語 (Haskell、Ocaml) では、そのガードを忘れると、無限ループ (index(-1, [0,0,0..])) につながる可能性があります。
when 句は、負のインデックスから保護します (編集: 元の質問へのコメントを参照してください;)。
また、デフォルトだけでなく、この句が有効な場合に明示的に言うように、より明確なコードも提供します。はい、一部の (多くの) ケースでは、テストが非常に複雑になるか、何らかの形式のデフォルト ケースが必要なため、これを適切に行うことができないことはわかっています。しかし、ここではありません。