2014-10-05 22 views
0

我是新來的語言,並試圖找出一個簡單函數的格式,該函數返回二次方程的根。Erlang的語法錯誤

discriminant(A,B,C) -> 
     B * B - 4 * A * C. 

    get_roots(A,B,C) when A == 0 -> error; 
    get_roots(A,B,C) when discriminant(A,B,C) == 0 -> [(-B/(2*A))]; 
    get_roots(A,B,C) when discriminant(A,B,C) > 0 -> 
     D = discriminant(A,B,C); 
     [((-1 * B + math:sqrt(D))/2 * A), ((-1 * B - math:sqrt(D))/2 * A)]; 
    get_roots(A,B,C) when discriminant(A,B,C) < 0 -> []. 

我做了什麼樣的語法錯誤?當我在shell,其中ps04.erl是在我寫我函數的文件輸入「C(PS04)」我得到的錯誤是:

ps04.erl:15: syntax error before: '[' 
    ps04.erl:23: Warning: variable 'Head' is unused %for a different function defined later 
    error 

回答

5

您不能在防範中使用功能,因此get_roots(A,B,C) when discriminant(A,B,C) == 0是禁止的。 正如@Amon提到的那樣,應該用逗號代替分號。我會寫這樣的功能:

get_roots(0,0,_) -> []; 
get_roots(0,B,C) -> [-C/B]; 
get_roots(A,B,C) -> get_roots(A,B,C,A*A-4*B*C). 

get_roots(A,B,C,0) -> [-B/(2*A)]; 
get_roots(A,B,C,D) when D > 0 -> 
    RD = math:sqrt(D), 
    [(-B+RD)/(2*A),(-B-RD)/(2*A)]; 
get_roots(_,_,_,_) -> []. 
+0

我已經做哈斯克爾了這麼久,我忘記了少數,你可以在衛士運用內建函數的......現在是時候二郎傾向於這個問題。 .. – Arnon 2014-10-06 08:15:01

4

您應該以取代分號D = discriminant(A,B,C);逗號: D = discriminant(A,B,C),

通過使用分號,您將結束此特定的get_roots/3函數子句,這不是您想要的(顯然,您在其下面有一個附加子句)。

在附註中,我從其他兩個問題中注意到,您從未接受過答案。如果有人回答了您的問題,並且這是一個有效的解決方案,請單擊該答案旁邊的複選標記。