2016-12-29 22 views
2

を使用して、私は、例外を処理するための機能を書いたが、私はプログラムを実行すると、私はこのエラーを取得する:ここで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 

は私のコードです:タイプrealの値が通常の=オペレータと一致するかどうかは確認できないため、

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.==等価演算子を使用する必要があります。

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 ==等価演算子を使用しなければならないことは決して決してありません。そして、私はプログラミングが好きですが、それはFunctional Programming semesterプロジェクトの一部です(3年目のCluj-NapocaのTechnical Universityで、MLはまだ使用されているプログラミング言語です)。 – Ela

+0

@Elaありがとう!私は実際にMLが教えに使われているのを見て嬉しく思っています。私はSMLがかなり好きです。また、機能的プログラミングhttps://www.meetup.com/Cluj-fp/ –

+0

に恋したい人は、これらの方々をチェックしてください。ありがとう、もう一度!それは非常に興味深いオンラインプラットフォームと思考を呼び起こす会議のようです。 – Ela