Этот индекс существует Функция в "Программирование Эрланга":
index(0, [X|_]) -> X;
index(N, [_|Xs]) when N>0 -> index(N-1, Xs)
Не лишний ли предохранитель "при N> 0" из-за сопоставления с образцом? Вызов index (0, List) никогда не закончится во втором предложении, поэтому N всегда будет> 0. Или я совершенно не прав?
Функция корректно работает при N> = 0. Без защиты при N <0 он прошел бы весь список:
index (-2, [1,2,3]) -> index (-3, [2,3]) -> ... - > индекс (-5, []) -> ошибка.
Это не большая проблема, только вы можете получить сбивающее с толку исключение. В языках с бесконечными списками (Haskell, Ocaml) забвение об этой защите может привести к бесконечному циклу: index (-1, [0,0,0 ..]).
The when clause guards against negative indices (edit: see comments to original question ;).
Он также дает более четкий код, поскольку вы явно указываете, когда это предложение действительно, а не только по умолчанию. Да, я знаю, что в некоторых (многих) случаях это невозможно сделать должным образом, так как тест может стать очень сложным или вам нужна какая-то форма случая по умолчанию. Но не здесь.