あなたが受け取った他の回答への単なる補遺:
作成しているデータ値は、実際にはチャーチ数字ではなくペアノ数字です。それらは密接に関連していますが、実際には互いに二重/逆です。ペアノ数字は、セットの概念から数を構築するという概念に基づいて構築されています。Haskell では、データ型の密接に関連した概念を使用して表現します。
{-# LANGUAGE RankNTypes #-}
import Prelude hiding (succ)
data Peano = Zero
| Succ Peano
deriving (Show)
一方、教会数字は、数字を関数としてエンコードします。
type Church = forall n. (n -> n) -> n -> n
zero :: Church
zero = \p -> id
succ :: Church -> Church
succ = \n p -> p . n p
これで、それらをまとめることができます:
peano :: Church -> Peano
peano c = c Succ Zero
fold :: forall n. (n -> n) -> n -> Peano -> n
fold s z Zero = z
fold s z (Succ p) = s (fold s z p)
church :: Peano -> Church
church p = \s z -> fold s z p
したがって、チャーチの数字は、本質的に、ペアノの数字を折りたたんだものです。And(peano . church)
は Peano 数字の ID ですが、Haskell では上記のように指定された型を直接構成することはできません。型宣言を省略すると、Haskell は、それらを構成できる十分な一般的な型を推測します。
この Ralf Hinze の Theoretical Pearl Church numbers, two には、関数型プログラミングのコンテキストにおける違いとそれらの相互関係の概要が記載されています。.
この二重性をさらに一般化できます。ペアノ数は本質的に自然数の初期 F 代数であり、チャーチ数は本質的に自然数の最終/終端 F 代数です。これの良い入門書は、Bart Jacobs と Jan Rutten のA Tutorial on (Co)Algebras and (Co)Inductionです。