Как сопоставить образец 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))
Другие вопросы по тегам