Кортежи SML программирования - PullRequest
0 голосов
/ 15 марта 2012
exception No_intersection of string

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

Функция должна проверять пересечение между двумя линиями. Каждый аргумент пары представляет собой уклон и y-перехват. Я должен найти пересечение между ними, если оно существует.

Я почему-то не могу показаться этой работой, и боролся с этим часами.

1 Ответ

1 голос
/ 15 марта 2012

Реалы не являются типом равенства в 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.

...