2011-12-06 44 views
4

我是ML的新手。如何處理ML除以零誤差

我需要定義一個函數以條件表達式作爲參數,問題是如果表達式無效,如"10 div 0 = 0"。我該如何處理?

例如,函數定義如下:foo exp1 = if (exp1) then ... else...exp1"10 div 0 = 0",如何處理這種除法錯誤。

+0

您可以發佈會是什麼樣正常語法像一個代碼塊,這樣也許有人可以嘗試幫助你.. – MethodMan

+0

例如,如果我將在C#中編碼的東西我會用這種類型的語法inline int roundDownDivide(int a,int b){if(a> = 0)return a/b;否則返回(a-b + 1)/ b; } – MethodMan

+0

@DJKRAZE我更新了我的問題。謝謝 – Jensen

回答

4

它看起來像你想問關於SML中的異常處理機制。

SML基礎庫中的div函數在調用10 div 0時引發Div異常。這取決於您是否需要值或不處理異常。您可以在此情況下,返回真/假或選項類型:

(* only catch exception, ignore value *) 
fun div_check (x, y) = (
    ignore (x div y); 
    false 
) handle Div => true 

(* catch exception and return option value *) 
fun div_check2 (x, y) = (
    SOME (x div y) 
) handle Div => NONE 

UPDATE:

這是很奇怪的是,編譯器不會提高Div例外,在這種情況下。我建議你定義一個定製的div功能,提高/處理異常你自己:

exception DivByZero; 

(* custom div function: raise DivByZero if y is zero *) 
infix my_div; 
fun x my_div y = 
    if y=0 then raise DivByZero else x div y 

fun div_check (x, y) = (
    ignore (x my_div y); 
    false 
) handle DivByZero => true 

fun div_check2 (x, y) = (
    SOME (x my_div y) 
) handle DivByZero => NONE 
+0

謝謝,看起來我在找什麼。但是,當我使用像div_check(10,0)這樣的函數時,sml仍然給我:'./sml:致命錯誤 - 意外故障,信號= 8,代碼= 0x7'。 – Jensen

+0

我用smlnj檢查並得到相同的行爲。檢查我的更新以獲得另一個解 – pad

+0

它的工作原理,非常感謝。 – Jensen