Церковные цифры Алонзо в SML - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть задание, которое включает в себя создание церковных цифр в SML. Я посмотрел вокруг и просто не могу найти, что я делаю не так. Цель состоит в том, чтобы сделать функцию, которая принимает int и возвращает церковную цифру, определенную как тип данных 'цифра = Num 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 (c, cn) = cn ((fn x => x+1), 0) 0;

, но это не работает и дает типам ошибок ошибки, не обобщенные из-за ограничения значений, создаются для фиктивных типов.

Когда я использовал код:

val zero = fn s => fn x => x; 

(для определения нуля), а затем

val next = fn n => fn s => fn x => (f ((n s) x));

(просто чтобы проверить, могу ли я увеличить ноль, прежде чем устанавливать итеративную или рекурсивную функцию), я получил ту же ошибку. Я потратил часы на эту проблему, не в состоянии представить церковную цифру. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

2 голосов
/ 06 февраля 2012

Я думаю, что вы столкнулись с «полиморфизмом значений» в SML'97. Здесь - это очень длинный раздел документации, обсуждающий его.

Один обходной путь - всякий раз, когда у вас есть выражение, которое вызывает эту проблему, например, next zero, оберните вокруг него функцию, например fn x => next zero x.

Еще одна вещь, которую, я думаю, вы могли бы сделать вместо оценки определений на верхнем уровне интерпретатора, обернуть определение и весь код, который использует его, в локальную область (например, внутри let ... in ... end) или в функции.

...