Реалы не являются типом равенства в SML, поэтому (m1-m2) = 0
является ошибкой типа.
Причина этого заключается в том, что ограниченная точность представлений с плавающей точкой может дать неожиданные результаты из-за ошибок округления (например, (1.0/7.7)*7.7 = 1.0
вернет false
). Вы можете обойти это, используя оператор ==
из библиотеки Real
, т.е. Real.==(m1-m2,0)
(или просто Real.==(m1,m2)
). Но имейте в виду, что это может быть ненадежным.
Вторая проблема заключается в том, что согласно типу возвращаемого значения ваша функция должна возвращать значение, а не print it. Все, что вам нужно сделать, это указать возвращаемое значение в предложении else
, то есть просто заменить print((x,y))
на (x,y)
.
И для чего бы это ни стоило, я бы избегал использования исключений, если вы можете; они как бы идут вразрез с идеей функционального программирования. Попробуйте вернуть (real*real) option
.