2016-12-29 84 views
2

我寫了一個函數來處理異常,如果我們得到了R2 = 0,I2 = 0,但是當我運行程序我得到這個錯誤:ML-錯誤使用異常

operatii.ml:12: error: Type error in function application. 
    Function: = : ''a * ''a -> bool 
    Argument: (r2, 0.0) : real * real 
    Reason: Can't unify ''a to real (Requires equality type) 
Found near 
    if r2 = 0.0 then raise ImpartitorulEsteNul else 
    (
    (r2 * r1 - i1 * i2)/(r2 * r2 + i1 * i2), 
    (... * ... + ... * ...)/(... * ... + ... * ...) 
    ) 
Exception- Fail "Static Errors" raised 

這裏是我的代碼:

infix %%%%; 
exception ImpartitorulEsteNul; 
fun (r1,i1) %%%% (r2:real,i2:real)=if r2=0.0 andalso i2=0.0 then raise ImpartitorulEsteNul 
         else ((r2*r1-i1*i2)/(r2*r2+i1*i2),(r2*i1+i1*i2)/(r2*r2+i1*i2)); 
+0

請問這是否是功課?我很好奇誰在羅馬尼亞使用SML(或摩爾多瓦?),無論是教學還是娛樂活動:) –

回答

1

這是因爲real類型的值不能被檢查的平等與正常=操作。發生這種情況是因爲在計算機內部如何表示浮點數,而且,老實說,這是我無法向別人解釋的東西。但是,解決方案很簡單。您必須使用Real.==等於運算符:

infix %%%%; 

infix ==; 

(* Import just the == function from the Real structure. *) 
(* I hope you can make sense out of this line. *) 
val op == = Real.==; 

exception ImpartitorulEsteNul; 

fun (r1,i1) %%%% (r2:real,i2:real) = 
    if r2==0.0 andalso i2==0.0 
    then raise ImpartitorulEsteNul 
    else ((r2*r1-i1*i2)/(r2*r2+i1*i2),(r2*i1+i1*i2)/(r2*r2+i1*i2)); 
+0

非常感謝!對於解決方案與=運算符一起工作的整數,但使用浮點數時,我永遠不會知道我必須使用Real。==相等運算符。而且,即使我喜歡編程,它也是函數式編程學期項目的一部分(所以,在Cluj-Napoca的技術大學,第三年,ML仍然是一種使用的編程語言)。 – Ela

+0

@Ela謝謝!我真的很驚喜地看到ML被用於教學,因爲我非常喜歡SML。另外,如果你會愛上函數式編程https://www.meetup.com/Cluj-fp/ –

+0

再次感謝這些人!這似乎是一個非常有趣的在線平臺和一個發人深省的會議。 – Ela