2012-07-03 35 views
2

我正在爲玩具語言定義變量函數sum函數。我很自然地允許它在沒有參數的情況下被調用,並且返回0,但是實際的語言(和它們的實現)在它們之間不同意。變量和函數的正確行爲

是否有一個用例返回零比拋出異常更不正確?

回答

5

從數學上講,empty sum(無數字之和)定義爲零。爲了數學上正確,返回零似乎在這裏是正確的選擇。在這種情況下拋出一個異常可能會使你的函數的使用複雜化,因爲如果你以某種方式提供零參數,你必須保證每次調用try/catch。

希望這會有所幫助!

0

有一種情況你可能不希望它返回零:假設你的語言是動態輸入的並且允許+在非數字類型上操作(例如,它可以像在Python中一樣連接字符串)。然後,一個空的和是不明確的,它是什麼樣的概念總結:你可能希望結果爲0爲數字,「」爲字符串,[]爲列表等。

如果你的語言是這樣的,那麼你可以選擇(1)無論如何返回0,並且接受sum(things)+other_thing不等於sum(things together with other_thing),除了數字,(2)拋出異常,(3)返回一些特殊值,當添加到數字時,其行爲如0,如「當添加到字符串等時,或者(4)無論如何返回(說)0並且說0+「」等於「」或類似的東西。如果玩具以外的語言有任何危險,請不要做#4。

哦,還有另外一個相關的案例:假設你的語言是靜態類型的,但是具有強大的類型推斷機制。然後,可以區分不加總數和不加總字符串,並在兩種情況下返回不同的東西。 (但是你需要一個相當複雜的類型系統來完成所有這些工作,我猜你對玩具語言不會感到困擾。)

+1

在這種情況下,正確的答案是返回標識元素爲任何二進制加法運算符是。並不是說你應該拋出異常,應該說是「返回身份」。 – templatetypedef

+0

麻煩的是,你的二元運算符可能沒有*一個單一的標識元素。例如,如果它添加數字並連接字符串,它就不會有。 (你可能會爭辯說,沒有身份元素的東西不應該被稱爲「+」,也不會將其變種版本稱爲「總和」,你可能是對的,但這是一個單獨的問題。) –

+2

但這些是兩個不同的運算符 - 一個是用整數定義的,一個是用字符串定義的。運算符超載,但每個運算符都有一個確定的單一標識元素。 – templatetypedef

相關問題