Вычитание церковных цифр в haskell

Я пытаюсь реализовать церковные числа в Haskell, но у меня возникла ошибка второстепенная проблема. Haskell жалуется на бесконечный тип с помощью

Происходит проверка: не удается построить бесконечный тип: t = (t -> t1) -> (t1 -> t2) -> t2

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

module Church where

type (Church a) = ((a -> a) -> (a -> a))

makeChurch :: Int -> (Church a)
makeChurch 0 = \f -> \x -> x
makeChurch n = \f -> \x -> f (makeChurch (n-1) f x)

numChurch x = (x succ) 0

showChurch x = show $ numChurch x

succChurch = \n -> \f -> \x -> f (n f x)

multChurch = \f2 -> \x2 -> \f1 -> \x1 -> f2 (x2 f1) x1

powerChurch = \exp -> \n -> exp (multChurch n) (makeChurch 1)

predChurch = \n -> \f -> \x -> n (\g -> \h -> h (g f)) (\u -> x) (\u -> u)

subChurch = \m -> \n -> (n predChurch) m
19
задан Probie 6 July 2011 в 11:38
поделиться