Я пытаюсь выучить Эрланг, используя Каратэ Чоп Ката . Я перевел тест runit, предоставленный в ката, на тест eunit и запрограммировал небольшую функцию для выполнения поставленной задачи.
-module(chop).
-export([chop/2]).
-import(lists).
-include_lib("eunit/include/eunit.hrl").
-ifdef(TEST).
chop_test_() -> [
?_assertMatch(-1, chop(3, [])),
?_assertMatch(-1, chop(3, [1])),
?_assertMatch(0, chop(1, [1])),
....several asserts deleted for brevity...
].
-endif.
chop(N,L) -> chop(N,L,0);
chop(_,[]) -> -1.
chop(_, [],_) -> -1;
chop(N, L, M) ->
MidIndex = length(L) div 2,
MidPoint = lists:nth(MidIndex,L),
{Left,Right} = lists:split(MidIndex,L),
case MidPoint of
_ when MidPoint < N -> chop(N,Right,M+MidIndex);
_ when MidPoint =:= N -> M+MidIndex;
_ when MidPoint > N -> chop(N,Left,M)
end.
Компилируется нормально. Однако при выполнении теста (среди прочего) возникает следующая ошибка:
::error:badarg
in function erlang:length/1
called as length(1)
in call from chop:chop/3
Я пробовал разные варианты объявления chop (N, [L], M) .... и использования длины ([L]), но не смог решить эту проблему. Любые предложения приветствуются.
пс. Как вы уже догадались, я неравнодушен к Эрлангу.