2014-01-13 194 views
2

我有以下Erlang代碼,當我嘗試編譯它時,它給出如下警告,但這是有道理的。函數需要兩個參數,但我需要匹配「其他所有」而不是x,y或z。Erlang案例陳述

-module(crop). 
-export([fall_velocity/2]). 

fall_velocity(P, D) when D >= 0 -> 
case P of 
x -> math:sqrt(2 * 9.8 * D); 
y -> math:sqrt(2 * 1.6 * D); 
z -> math:sqrt(2 * 3.71 * D); 
(_)-> io:format("no match:~p~n") 
end. 

crop.erl:9: Warning: wrong number of arguments in format call. 

我正在嘗試一個匿名變量後io格式,但它仍然不開心。

回答

8

以您使用〜p的格式。這意味着 - 打印價值。所以你必須指定要打印的值。案例

最後一行必須

_ -> io:format("no match ~p~n",[P]) 

此外,IO:格式returms 'OK'。所以如果P不是x或z,你的函數將返回'ok'而不是數值。我會建議返回標籤值來分隔正確和錯誤的回報。的

fall_velocity(P, D) when D >= 0 -> 
case P of 
x -> {ok,math:sqrt(2 * 9.8 * D)}; 
y -> {ok,math:sqrt(2 * 1.6 * D)}; 
z -> {ok,math:sqrt(2 * 3.71 * D)}; 
Otherwise-> io:format("no match:~p~n",[Otherwise]), 
      {error, "coordinate is not x y or z"} 
end. 
+1

我會拋出一個異常,或者甚至不檢查x,y,z以外的其他東西。 Erlang難以理解,不需要過度。 – Berzemus

+0

沒錯。但是如果不檢查,你可以在比調用函數晚得多的地方發生錯誤。 {ok,R} = fall_velocity(A,B)可能會提前指出錯誤。 –

+0

http://www.erlang.se/doc/programming_rules.shtml#REF32551 –

3

樣讓評論對方的回答明確的,這是我會怎麼寫功能:

-module(crop). 
-export([fall_velocity/2]). 

fall_velocity(P, D) when D >= 0 -> 
    case P of 
     x -> math:sqrt(2 * 9.8 * D); 
     y -> math:sqrt(2 * 1.6 * D); 
     z -> math:sqrt(2 * 3.71 * D) 
    end. 

也就是說,處理不正確的說法,你的情況表達。如果有人通過foo作爲參數,您將收到錯誤{case_clause, foo}以及指向此函數其調用者的堆棧跟蹤。這也意味着該函數不能將不正確的值泄漏到代碼的其餘部分中,因爲被調用的參數不正確。

返回{ok, Result} | {error, Error}如同在其他答案中一樣有效。您需要選擇最適合您的案例的變體。