2012-03-15 6 views
0
exception No_intersection of string 

fun check_in ((m1:real, b1:real), (m2:real, b2:real)):real*real = 

この関数は、2つの行の交差をチェックすることになっています。各対の引数は勾配とy切片です。私はそれが存在する場合、2つの間の交差点を見つけるはずです。SMLプログラミングのヘルプタプル

私は何らかの理由でこの作品のように見えることができず、これを何時間も苦労しています。

+0

行を入力する方法がわかりません。通常、線は2点または点とベクトルで記述されます。いずれの場合も4つのスカラー値。しかし、あなたは4つの値を持っています。 PS:宿題? – Matthias

+0

@Matthias: 'm'は勾配、' b'はy切片です。 –

+0

@NickBarnes:もちろん!私は盲目でした。 – Matthias

答えて

1

実数はSMLの等価型ではないため、(m1-m2) = 0は型エラーです。

これは、浮動小数点表現の精度が限定されているため、丸め誤差のために予期しない結果が生じる可能性があるからです(例:(1.0/7.7)*7.7 = 1.0falseです)。これを回避するには、Realライブラリの==演算子、つまりReal.==(m1-m2,0)(またはちょうどReal.==(m1,m2))を使用します。しかし、それは信頼できないことに注意してください。

第二の問題は、戻り値の型に応じて、あなたの関数が返り値、ない印刷ことになっている、ということです。ここで行う必要があるのは、else句の戻り値を指定することだけです。つまり、print((x,y))(x,y)に置き換えてください。

そして、それが価値があるのなら、できる限り例外を使うことを避けたいと思います。関数型プログラミングの考え方に逆らっています。代わりに(real*real) optionを返送してください。