Введение в программирование на Erlang. Урок 3.

preview_player
Показать описание
Урок 3. Кортежи, списки, охранные выражения.
Рекомендации по теме
Комментарии
Автор

thank you very much, great lessons! Greatings from Australia

ValKizel
Автор

@Andrey R: это происходит потому, что оператор "or" обязательно вычисляет оба свои аргумента. Таким образом, когда задан пустой список "[]", то взятие хвоста "tl([])" не отрабатывает, а следовательно гварды не срабатывают и поэтому no function clause matching tm1:is_polindrom([]). Что бы справится с данной ситуацией были в зыке есть orelse, который не вычисляет правую часть, если левая уже истинна. Можно написать вот так: is_polindrom(List) when ((List == []) orelse (tl(List) == [])) -> true; и тогда будет работать. А вообще в языке принято отделять гварды с помощью ";" (эквивалент "ИЛИ"). Т.е. можно написать и вот так: is_polindrom(List) when List == []; tl(List) == [] -> true;

Gohan
Автор

Кому-то мб будет полезно по поводу _H:

The anonymous variable is denoted by underscore (_) and can be used when a variable is required but its value can be ignored.

Variables starting with underscore (_), for example, _Height, are normal variables, not anonymous. They are however ignored by the compiler in the sense that they do not generate any warnings for unused variables.

Tolyankartofan
Автор

Привет, спасибо за урок. Почему так?

tm1:is_polindrom([]).
** exception error: no function clause matching tm1:is_polindrom([])

Вроде ведь is_polindrom(List) when ((tl(List) == []) or (List ==[])) -> true; обрабатывает такой случай?

upovar