2016-12-29 88 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