exception No_intersection of string
fun check_in ((m1:real, b1:real), (m2:real, b2:real)):real*real =
この関数は、2つの行の交差をチェックすることになっています。各対の引数は勾配とy切片です。私はそれが存在する場合、2つの間の交差点を見つけるはずです。SMLプログラミングのヘルプタプル
私は何らかの理由でこの作品のように見えることができず、これを何時間も苦労しています。
exception No_intersection of string
fun check_in ((m1:real, b1:real), (m2:real, b2:real)):real*real =
この関数は、2つの行の交差をチェックすることになっています。各対の引数は勾配とy切片です。私はそれが存在する場合、2つの間の交差点を見つけるはずです。SMLプログラミングのヘルプタプル
私は何らかの理由でこの作品のように見えることができず、これを何時間も苦労しています。
実数はSMLの等価型ではないため、(m1-m2) = 0
は型エラーです。
これは、浮動小数点表現の精度が限定されているため、丸め誤差のために予期しない結果が生じる可能性があるからです(例:(1.0/7.7)*7.7 = 1.0
はfalse
です)。これを回避するには、Real
ライブラリの==
演算子、つまりReal.==(m1-m2,0)
(またはちょうどReal.==(m1,m2)
)を使用します。しかし、それは信頼できないことに注意してください。
第二の問題は、戻り値の型に応じて、あなたの関数が返り値、ない印刷ことになっている、ということです。ここで行う必要があるのは、else
句の戻り値を指定することだけです。つまり、print((x,y))
を(x,y)
に置き換えてください。
そして、それが価値があるのなら、できる限り例外を使うことを避けたいと思います。関数型プログラミングの考え方に逆らっています。代わりに(real*real) option
を返送してください。
行を入力する方法がわかりません。通常、線は2点または点とベクトルで記述されます。いずれの場合も4つのスカラー値。しかし、あなたは4つの値を持っています。 PS:宿題? – Matthias
@Matthias: 'm'は勾配、' b'はy切片です。 –
@NickBarnes:もちろん!私は盲目でした。 – Matthias