Как сопоставить образец 0.0 в SML?
У меня есть следующий код:
datatype complex = RealImg of real * real | Infinity;
fun divisionComplex(RealImg(a, b), RealImg(0.0, 0.0)) = Infinity
fun divisionComplex(RealImg(a, b), RealImg(c, d)) =
RealImg ((a * c + b * d) / (c * c + d * d), ((b * c) - (a * d))/ (c* c + d * d))
Однако это не с этим:
Error: syntax error: inserting EQUALOP
Я очень смущен. Почему это происходит? Я знаю, что не могу сравнить два реала в SML, но как мне сделать сопоставление с 0?
1 ответ
Решение
Как вы сказали, SML не позволяет сопоставлять реальные числа с шаблоном, но рекомендует использовать Real.==
вместо этого или сравните разницу между этими числами и некоторой дельтой.
А как насчет просто использования оператора if для этого? (также некоторые Infinity
случаи добавлены только для того, чтобы сделать совпадение с параметрами функции исчерпывающим, но не стесняйтесь изменять его, потому что оно не претендует на правильность)
datatype complex = RealImg of real * real | Infinity;
fun divisionComplex(Infinity, _) = Infinity
| divisionComplex(_, Infinity) = Infinity
| divisionComplex(RealImg(a, b), RealImg(c, d)) =
if Real.== (c, 0.0) andalso Real.== (d, 0.0)
then Infinity
else
RealImg ((a * c + b * d) / (c * c + d * d), ((b * c) - (a * d))/ (c* c + d * d))