Стандартный ML не имеет полиморфной рекурсии. Добавление рекурсии к модульному языку позволяет нам восстановить полиморфную рекурсию как частный случай, используя фиксированные точки эндофункторов. Например:

signature SEQ =
sig
  type 'a seq

  (* operations on sequences *)
end

functor BootstrapSeq (S : SEQ) =
struct
  datatype 'a seq
    = Nil
    | Zero of ('a * 'a) S.seq
    | One of 'a * ('a * 'a) S.seq

  (* operations on sequences *)
end

structure rec Seq = BootstrapSeq (Seq)

Известно, что полиморфная рекурсия делает неразрешимым вывод типов. Однако определение функтора уже содержит частичную информацию о типе, а именно сигнатуру его аргумента. Достаточно ли этой информации, чтобы снова сделать вывод типа разрешимым?

2
pyon 25 Июн 2016 в 11:16
Какая реализация поддерживает structure rec?
 – 
Ionuț G. Stan
25 Июн 2016 в 16:42
@ IonuțG.Stan: AFAICT, нет, хотя я не пробовал SML / NJ.
 – 
pyon
25 Июн 2016 в 16:43
Ах, так что это скорее теоретический вопрос. SML / NJ его не поддерживает.
 – 
Ionuț G. Stan
25 Июн 2016 в 16:44
@ IonuțG.Stan, Moscow ML поддерживает его с некоторыми ограничениями. И OCaml, если вы хотите это посчитать.
 – 
Andreas Rossberg
25 Июн 2016 в 16:46

1 ответ

Лучший ответ

Да, потому что подпись предоставляет «прямое объявление» полиморфного типа, поэтому его не нужно выводить рекурсивно. Кроме того, вам не нужен функтор, вы можете напрямую написать привязку рекурсивной структуры. Но это требует аннотации подписи и, следовательно, равносильно тому же.

3
Andreas Rossberg 25 Июн 2016 в 16:45