-- 将lambda函数(\f -> f . f . f ...)封装成一个数据类型,因此用newtype来
-- 得到这个新的Church数的数据类型。
newtype Church = Church { runChurch :: forall a. (a -> a) -> a -> a }
-- | 先定义几个基本函数,用于给后面的运算定义使用
-- 0函数, 0个函数f的组合是函数id
zero = Church $ const id
-- 后继函数, 从n个函数f的组合得到n+1个函数f的组合
succChurch n = Church $ \f -> f . (runChurch n f)
-- 前驱函数,从n个函数f的组合得到n-1个函数f的组合
predChurch n = Church $ \f x -> runChurch n (\g h -> h (g f)) (const x) id
-- | 这是自然数上的归纳函数
iter :: a -> (a -> a) -> N -> a
iter z step n = runChurch n step z
-- | 这是加法的定义,就是将两个列表连接起来
plus :: N -> N -> N
plus m n = Church $ \f -> (runChurch n f) . (runChurch m f)
-- | 这是乘法的定义, 使用了归纳法
mult :: N -> N -> N
mult m n = Church $ runChurch n . runChurch m
-- | 这是幂运算的定义,使用了归纳法
pow :: N -> N -> N
pow m n = Church $ runChurch n (runChurch m)
数学联邦政治世界观提示您:看后求收藏(同人小说网http://tongren.me),接着再看更方便。