Haskell 教堂编码(条件句)

Haskell 教堂编码(条件句),haskell,church-encoding,Haskell,Church Encoding,我试图写出一些lambda演算,但我不能让church条件句起作用。我应该说我是哈斯克尔·努伯 我已经在网上和其他地方看过了解决方案,但它们都涉及到引入新类型和其他技巧,但我希望尽可能使其接近原始语法。例如: tru :: Integer -> Integer -> Integer tru = \x -> \y -> x fals :: Integer -> Integer -> Integer fals = \x -> \y -> y mai

我试图写出一些lambda演算,但我不能让church条件句起作用。我应该说我是哈斯克尔·努伯

我已经在网上和其他地方看过了解决方案,但它们都涉及到引入新类型和其他技巧,但我希望尽可能使其接近原始语法。例如:

tru :: Integer -> Integer -> Integer
tru = \x -> \y -> x

fals :: Integer -> Integer -> Integer
fals = \x -> \y -> y

main = do
  print (tru 2 3)
  print (fals 5 6)
匹配church Boolean的确切语法:

\a.\b.a
\a.\b.b 
有没有办法匹配church if/else的确切语法? 我正在尝试复制\p.\a.\b.p a b,但我不确定我做错了什么:

ifelse :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
ifelse = \p -> \a -> \b -> p -> a -> b

main = do
  print (tru 2 3)
  print (fals 5 6)
  print (ifelse tru 42 58)

你想要什么

ifelse :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
ifelse = \p -> \a -> \b -> p a b
甚至

ifelse = id
还要记住,Church布尔值只能应用于整数,这可能是有限制的。 您可以通过给它们一个多态类型,使您的编码更加通用

-- Warning: untested
{-# LANGUAGE RankNTypes #-}
type Cbool = forall a. a->a->a
tru :: Cbool
tru = const
fals :: Cbool
fals = const id
ifelse :: Cbool -> a -> a -> a
ifelse = id
type Cnat = forall a. (a->a)->a->a
zero :: Cnat
zero = \s z -> z   -- const id
-- etc

你想要什么

ifelse :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
ifelse = \p -> \a -> \b -> p a b
甚至

ifelse = id
还要记住,Church布尔值只能应用于整数,这可能是有限制的。 您可以通过给它们一个多态类型,使您的编码更加通用

-- Warning: untested
{-# LANGUAGE RankNTypes #-}
type Cbool = forall a. a->a->a
tru :: Cbool
tru = const
fals :: Cbool
fals = const id
ifelse :: Cbool -> a -> a -> a
ifelse = id
type Cnat = forall a. (a->a)->a->a
zero :: Cnat
zero = \s z -> z   -- const id
-- etc

我在这里注意到,如果我们想对教堂数字进行幂运算,那么实际上需要秩-n类型。@AndrásKovács Really RankNTypes对于所有教堂数字都是必需的,CNum=forall c。c->c->c->c。否则,您可以使用OP的代码打破参数化并返回非教会数字的内容,如-1。谢谢,这非常有用。只是一个问题:使用教堂编码有什么限制吗?例如,你能用它们编写一个完整的编程语言吗?假设您可以将表示转换回最终用户可读的内容?@gyeh您可以使用Church编码来表示任何代数数据类型,并表示您在函数式语言中找到的典型构造/破坏模式匹配机制。如果您进一步添加无约束递归或某个不动点组合器,您将得到一种功能强大的图灵编程语言。不过,这不是一个非常方便用户的版本;-当然,虽然可以用这种语言表达任何计算,但仍然缺少I/O原语文件系统访问、网络、图形、声音等等,forall将其限制在您想要的范围内,实际上给了最终用户更多的自由。我在这里注意到,如果我们想对教堂数字进行幂运算,那么实际上需要秩-n类型。@AndrásKovács Really RankNTypes对于所有教堂数字都是必需的,CNum=forall c。c->c->c->c。否则,您可以使用OP的代码打破参数化并返回非教会数字的内容,如-1。谢谢,这非常有用。只是一个问题:使用教堂编码有什么限制吗?例如,你能用它们编写一个完整的编程语言吗?假设您可以将表示转换回最终用户可读的内容?@gyeh您可以使用Church编码来表示任何代数数据类型,并表示您在函数式语言中找到的典型构造/破坏模式匹配机制。如果您进一步添加无约束递归或某个不动点组合器,您将得到一种功能强大的图灵编程语言。不过,这不是一个非常方便用户的版本;-当然,虽然可以用这种语言表达任何计算,但仍然缺少I/O原语文件系统访问、网络、图形、声音……是的,问题是它仅限于您想要的内容,实际上给了最终用户更多的自由。