2015-08-18 4 views
2

При определении простой функции, которая принимает квадрат значения, SML NJ передает подпись для этой функции целым типам. При объявлении подписи для типов float SML может работать с значениями с плавающей запятой.Тип арифметической функции SML выводится на int

 
- fun sqr x = x * x; 
val sqr = fn : int -> int 
- fun sqqr (x : real) = x * x; 
val sqqr = fn : real -> real 
- sqqr 3.4; 
val it = 11.56 : real 
  • Почему и как делает SML вывод этот конкретный тип здесь?
  • Есть ли особые предпочтения для ints?
  • Это специальное поведение для этих арифметических операций или его можно найти в других местах?

ответ

5

Подход SML к типам действительно не очень хорошо работает при перегрузке, поэтому вы не можете определить свои перегруженные функции. Но - перегрузка арифметических и реляционных операторов настолько распространена в языках программирования, что разработчики SML приняли стандартную перегрузку +, * и т. Д. Это представляло проблему с механизмом вывода типа SML. Чтобы решить эту проблему, они могли потребовать объявления явного типа в таких случаях, но это уменьшило бы полезность вывода типа. Вместо этого они заперли идею выбора типа по умолчанию для функций, которые обладают свойством, что их определение имеет смысл как для ints, так и для reals (или даже строк, если оно включает < или>), а также механизм переопределения значения по умолчанию. Учитывая, что основные применения SML в таких вещах, как автоматические теоретические предсказатели, а не численный анализ, int кажется естественным выбором. Я, вероятно, принимал по умолчанию 10 раз за каждый раз, когда мне нужно было переопределить его.

1

SML 97 specification определяет поведение перегруженных операторов в Приложение E. Для *,+,- по умолчанию используется тип int. Для / по умолчанию используется тип real. Это помогает поддерживать «Стандарт» в «Стандартном ML».