Как привести тип в SML (например, приведение типа) - PullRequest
3 голосов
/ 14 апреля 2009

Я создаю структуру Rationals (int * int), и одна из моих функций:

  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

gcd дает мне наибольший общий знаменатель, поэтому я получаю не 2/8, а 1/4, как и должно быть. gcd использует mod для поиска gcd, поэтому возвращает int. Но я не могу получить выражение с делением, которое будет напечатано как int. Когда я попытался добавить : int * int в конец объявления diff, это выдает ошибку типа, что выражения real * real и int * int не совпадают.

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

Ответы [ 2 ]

5 голосов
/ 14 апреля 2009

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

2 голосов
/ 14 апреля 2009

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

...