2009-04-14 6 views
3

Я создаю структуру 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 не совпадают.

Как заставить целочисленное деление или отличить выражение к целому? Если возможны оба варианта, какой из них лучше?

ответ

5

Да, вы используете неправильный оператор. / - оператор деления с плавающей запятой. div (как упоминал Д.Шаули) является оператором целочисленного деления. div - это то, что нужно использовать в этом случае, потому что вы делите два целых числа и хотите получить целое число.

2

Имеет ли SML оператор div, если это возможно? Прошло много лет с тех пор, как я играл с ML, но это похоже на довольно стандартный способ заставить целое разделение.