教会编码(条件)

时间:2014-04-17 07:12:40

标签: haskell church-encoding

我正在尝试写出一些lambda演算,但我无法让教堂条件得以发挥作用。我应该说我是Haskell noob。

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

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)

匹配教会布尔的确切语法:

\a.\b.a
\a.\b.b 

任何方式匹配教堂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)

1 个答案:

答案 0 :(得分:7)

你想要像

这样的东西
ifelse :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
ifelse = \p -> \a -> \b -> p a b

甚至

ifelse = id

还要记住,你的教会布尔只能应用于整数,这可能是限制性的。 你可以通过赋予它们多态类型来使你的编码更加通用。

-- 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