Официальный стандарт SML'97 базовая библиотека представляет целый ряд структур, таких как Int, IntInf, Int32, Int64, LargeInt и т. Д.
Чтобы реально использовать их на практике, чтобы заставить вещи работать так, как ожидалось, и чтобы они работали эффективно, вам нужно внимательно посмотреть на реализацию SML.
Одно семейство реализаций имитирует структуру памяти C и Java, поэтому Int32 будет действительно 32-битным машинным словом (но с проверкой переполнения), а Int64 - 64-битным машинным словом. SML / NJ является ярким примером для этого, и его маленькая внутренняя арифметика быстрая, но большая внутренняя арифметическая медленная.
Другое семейство реализаций происходит из опыта символьных вычислений (LISP или Компьютерная алгебра), где Poly / ML является ярким примером. Здесь у вас есть Int = IntInf = LargeInt по умолчанию, и реализация сначала использует (часть) машинное слово в качестве приближения, пока оно не переполнится, а затем переключается на действительно большие целые числа, которые выделяются в куче (в виде значений в штучной упаковке). Poly / ML использует библиотеку GNU MP для этой большой части.
Таким образом, Int / IntInf очень эффективен, если ваше приложение имеет целые числа, а не машинные слова определенного размера: Int32 в символьной модели не поместится в одно слово на 32-битном оборудовании из-за дополнительных битов тега, которые являются обязательными. Так что некоторые алгоритмы, которые на самом деле об арифметике слов, будут ухудшаться, например, SHA1 на 32-битном оборудовании.
С другой стороны, неявное обновление меньшего размера слова int до выделенного в куче большого int дает вам нечто лучшее, чем BigInt в Java, потому что вам не понадобятся полные издержки объекта для небольших значений: 42 будет просто какой-то битовый шаблон в регистре (с дополнительным битом тега), но не тяжелый блок в куче.