人们常说
tru t f = t
fls t f = f
在“我们可以使用这些术语来执行测试布尔值的真实性的操作”的意义上表示 True 和 False。
但这隐藏了一个重要的警告,因为它似乎只在无类型的 lambda 演算中是正确的。如果我只是将这些值插入haskell,我可以编写一个函数:
tryMeOnFalse ∷ (∀ t f. t → f → t) → String
tryMeOnFalse tr = "Hi"
a' = tryMeOnFalse tru
b' = tryMeOnFalse fls -- type error !
它在类型级别区分 tru 和 fls。这么说是多么错误/真实:
- 在 STLC中
tru
,fls
是一些提升'Boolean
类型的价值级别见证,它有类型'True
和'False
- 在 STLC 中(强制)类型值
(tru :: ∀ t . t → t → t)
并(fls :: ∀ t . t → t → t)
表示 True 和 False(并且在未类型化中,通常情况下)
编辑:我现在意识到感谢@Daniel Wagner 的回答,我在我的问题中考虑的是二阶 Lambda 微积分而不是 STLC。