教会编码的布尔和STLC

时间:2016-06-05 15:25:01

标签: haskell data-kinds church-encoding

通常说

tru t f = t
fls t f = f

表示“我们可以使用这些术语来执行测试布尔值真值的操作”这一意义上的真假。

但这隐藏了一个重要的警告,因为它似乎只适用于无类型的lambda演算。如果我只是在haskell中插入这些值,我可以写一个函数:

tryMeOnFalse ∷  (∀ t f. t → f → t) → String
tryMeOnFalse tr = "Hi"
a' = tryMeOnFalse tru
b' = tryMeOnFalse fls  -- type error !

在类型级别区分tru和fls。说:

是多么错误/真实
    STLC中的
  • trufls是某种促销'Boolean种类的价值级见证,其类型为'True'False
  • 在STLC中,(强制)键入的值(tru :: ∀ t . t → t → t)(fls :: ∀ t . t → t → t)表示True和False(并且在无类型中,通常很好)

编辑:我现在感谢@Daniel Wagner的回答我在考虑二阶Lambda微积分而不是STLC。

1 个答案:

答案 0 :(得分:4)

在无类型的lambda演算中不仅如此;但是在类型化的计算中,人们确实需要像往常一样小心打字。我们应该定义:

type Boolean = forall r. r -> r -> r

我们当然有tru, fls :: Boolean,并且应该注释它们。 但我们tryMeOnFalse :: Boolean -> String!所以这里没有真正的矛盾。

您对STLC的评论有点奇怪,因为STLC的打字系统非常不同。我们需要为每个结果类型分别使用布尔类型,因为没有多态。

在Haskell中,当然可以定义仅由tru或仅由fls居住的类型(当然,每种类型也由undefined居住);但这通常不是很有用。