Я знаю, что могу написать y-combinator в SML следующим образом: Сначала объявите новый тип данных, чтобы обойти несоответствие типа из-за округлости.y-combinator in StandardML
datatype 'a mu = Roll of ('a mu -> 'a)
val unroll = fn Roll x => x
Теперь вы можете легко определить, у-комбинатор:
val Y = fn f => (fn x => fn a => f (unroll x x) a)
(Roll (fn x => fn a => f (unroll x x) a)))
Тогда вы закончите, вы можете использовать его как это:
val f = Y (fn f => fn n => if n = 0 then 1 else n * f (n-1))
Мой вопрос: Существуют ли другие способы реализации y-комбинатора в SML?
Вы не можете, так как приложение само необходимо для этого требуется рекурсивного типа. –
@NaCl хорошо, вы вроде как можете, так как «fun» - это производная форма «val rec», но это было бы эквивалентно использованию «fun». – matt