SML, как явно установить тип параметра функции в IntInf

Я пытаюсь создать функцию сортировки для уникальных больших чисел в SML, но компилятор продолжает устанавливать тип моей функции на int вместо 'a. Как я могу явно указать компилятору использовать IntInf?

Вот мой код:

fun selectsort([a]) = [a]
  | selectsort(h::t) =
  if (hd(selectsort(t))) < h then hd(selectsort(t))::h::tl(selectsort(t))
  else h::selectsort(t);

когда я пытаюсь

fun selectsort([a]) = [a]
  | selectsort(l : IntInf list) =
  if (hd(selectsort(tl(l)))) < hd(l) then hd(selectsort(tl(l)))::h::tl(selectsort(tl(l)))
  else hd(l)::selectsort(tl(l));

он продолжает выдавать мне «Ошибка: конструктор несвязанного типа: IntInf»


person Jean-Luc Nacif Coelho    schedule 07.12.2014    source источник
comment
Решено обходным путем: if (hd(selectsort(t)) + IntInf.fromInt(0)) < h + IntInf.fromInt(0) then hd(selectsort(t))::h::tl(selectsort(t))   -  person Jean-Luc Nacif Coelho    schedule 07.12.2014


Ответы (1)


IntInf — имя модуля, тип называется IntInf.int. Увы, ваш код несколько упростился:

fun selectsort([a]) = [a]
  | selectsort(x::y::t : IntInf.int list) =
    if y < x then y::x::selectsort(t) else x::selectsort(y::t)

Однако обратите внимание, что IntInf — это необязательный модуль, который доступен не во всех реализациях. (Кроме того, вы должны добавить случай для пустого списка.)

person Andreas Rossberg    schedule 07.12.2014
comment
Я сделал это для очень специфического фрагмента кода, поэтому пустые списки не будут сортироваться. - person Jean-Luc Nacif Coelho; 08.12.2014
comment
@Jean-LucNacifCoelho, в любом случае считается хорошим стилем добавлять отсутствующие случаи и делать их, например. создать исключение Domain. - person Andreas Rossberg; 08.12.2014