konzipiert Ich versuche Erlang mit der Karate Chop Kata zu lernen. Ich übersetzte den in den Kata gelieferten Runit-Test in einen Eunit-Test und programmierte eine kleine Funktion, um die anstehende Aufgabe zu erfüllen.Liste ist als Integer von Länge Funktion
-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.
Compiliert ok.Running den Test jedoch gibt, (unter anderem) die folgenden Fehler an:
::error:badarg
in function erlang:length/1
called as length(1)
in call from chop:chop/3
ich verschiedene Permutationen erklärt chop (N, [L], M) versucht haben. ... und mit Länge ([L]), konnte dieses Problem jedoch nicht lösen. Irgendwelche Vorschläge sind willkommen.
ps. Wie du vielleicht vermutet hast, bin ich ein Nube, wenn es um Erlang geht.
Guter Link für nicht Windows-Benutzer! – rdo