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

В «Программировании Эрланга» есть эта индексная функция:

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

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

Ответы [ 3 ]

12 голосов
/ 08 августа 2010

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

index (-2, [1,2,3]) -> index (-3, [2,3]) -> ... -> index (-5, []) -> error.

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

6 голосов
/ 08 августа 2010

Предложение when защищает от отрицательных индексов (правка: см. Комментарии к исходному вопросу;).

5 голосов
/ 09 августа 2010

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

...