1

我正在尝试写出一些 lambda 演算,但我无法让教堂条件起作用。我可能应该说我是一个 Haskell 菜鸟。

我已经在网上和 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)
4

1 回答 1

7

你想要类似的东西

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
于 2014-04-17T07:21:59.967 回答