我正在尝试写出一些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)
答案 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