SML и церковные цифры

У меня есть задание, в котором мне нужно реализовать церковные цифры в SML, используя тип данных: тип данных 'церковь = C of ('a -'a) * 'a -> 'a

Я должен написать функцию create :int -> 'церковь и функцию ChurchToint. Пока у меня есть следующий код:

datatype 'a church = C of ('a -> 'a) * 'a -> 'a
val ZERO = C(fn (f,x) => x)
fun subCreate 0 (f,x) = x
    | subCreate n (f,x) = f (subCreate (n-1) (f,x))
fun create n = C(fn (f,x) => subCreate n (f,x));
fun churchToInt cn = cn (fn x => x + 1) 0;

Я знаю, что я довольно близко. Не могли бы вы помочь мне правильно реализовать это? Спасибо


sml
person duby12    schedule 24.09.2010    source источник


Ответы (1)


Вы правы, вы очень близки. В вашей функции ChurchToInt есть только две незначительные ошибки:

  1. Ты не распаковываешь церковную цифру. т.е. вы рассматриваете свой аргумент cn как функцию, но churchToInt должен принимать C содержащий функцию, а не саму функцию. Поэтому измените его на fun churchToInt (C cn) =, чтобы распаковать функцию с помощью сопоставления с образцом.

  2. Вы применяете два аргумента к функции, используя стиль карри, но C было определено, чтобы содержать функцию, принимающую кортеж. Поэтому вместо cn (fn x => x+1) 0 напишите cn ((fn x => x+1), 0).

С этими двумя изменениями ваш код работает нормально.

person sepp2k    schedule 24.09.2010
comment
Я сделал это, однако по-прежнему получаю ChurchToInt:int Church -> int вместо 'a Church. И кроме того, когда я запускаю, например: create 5; Я получаю: автомобили типа предупреждения, не обобщенные из-за ограничения значения, создаются для фиктивных типов (X1,X2,....) val it = C fn : ?.X1 Church - person duby12; 24.09.2010
comment
@tester: Конечно, тип int church -> int. Если бы тип был 'a church -> int, вам не разрешили бы передать функцию типа int -> int. Если задание действительно требует, чтобы вы определили функцию типа 'a church -> int, я осмелюсь сказать, что это не разрешимо - по крайней мере, не с данным определением типа. - person sepp2k; 25.09.2010
comment
но как насчет функции create, я имею в виду, что она работает, например, ChurchToInt (create 5) возвращает 5, но всякий раз, когда я запускаю create, она продолжает выдавать мне эту странную ошибку - person duby12; 25.09.2010
comment
@tester: это не ошибка. Это предупреждение. Если вы хотите, вы можете убрать его, указав явный тип. Например. val myCn : int church = create 5 будет компилироваться и запускаться без предупреждения. - person sepp2k; 25.09.2010