Почему «когда» используется в этой функции?

Этот индекс существует Функция в "Программирование Эрланга":

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

Не лишний ли предохранитель "при N> 0" из-за сопоставления с образцом? Вызов index (0, List) никогда не закончится во втором предложении, поэтому N всегда будет> 0. Или я совершенно не прав?

7
задан Jan Deinhard 22 August 2010 в 08:38
поделиться

3 ответа

Функция корректно работает при N> = 0. Без защиты при N <0 он прошел бы весь список:

index (-2, [1,2,3]) -> index (-3, [2,3]) -> ... - > индекс (-5, []) -> ошибка.

Это не большая проблема, только вы можете получить сбивающее с толку исключение. В языках с бесконечными списками (Haskell, Ocaml) забвение об этой защите может привести к бесконечному циклу: index (-1, [0,0,0 ..]).

12
ответ дан 6 December 2019 в 07:49
поделиться

The when clause guards against negative indices (edit: see comments to original question ;).

6
ответ дан 6 December 2019 в 07:49
поделиться

Он также дает более четкий код, поскольку вы явно указываете, когда это предложение действительно, а не только по умолчанию. Да, я знаю, что в некоторых (многих) случаях это невозможно сделать должным образом, так как тест может стать очень сложным или вам нужна какая-то форма случая по умолчанию. Но не здесь.

5
ответ дан 6 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: