Я создаю структуру Rationals (Int * Int) и один из моих функций:Как сподвигнуть типа в SML (например, литье)
fun diff ((n, d), (n', d')) = let val (top, bot) = sum ((n, d), (~n', d'))
in
(top/gcd(top, bot), bot/gcd(top, bot))
end
НОД дает мне наибольший общий знаменатель, так Я не получаю 2/8, а скорее 1/4, как и должно быть. gcd использует mod для поиска gcd, поэтому он возвращает int. Но я не могу заставить выражение с делением набираться как int. Когда я попытался добавить : int * int
в конец описания diff, он дает мне ошибку типа, что выражения real * real и int * int не совпадают.
Как заставить целочисленное деление или отличить выражение к целому? Если возможны оба варианта, какой из них лучше?