通常说
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。说:
是多么错误/真实tru
和fls
是某种促销'Boolean
种类的价值级见证,其类型为'True
和'False
(tru :: ∀ t . t → t → t)
和(fls :: ∀ t . t → t → t)
表示True和False(并且在无类型中,通常很好)编辑:我现在感谢@Daniel Wagner的回答我在考虑二阶Lambda微积分而不是STLC。
答案 0 :(得分:4)
在无类型的lambda演算中不仅如此;但是在类型化的计算中,人们确实需要像往常一样小心打字。我们应该定义:
type Boolean = forall r. r -> r -> r
我们当然有tru, fls :: Boolean
,并且应该注释它们。
但我们不有tryMeOnFalse :: Boolean -> String
!所以这里没有真正的矛盾。
您对STLC的评论有点奇怪,因为STLC的打字系统非常不同。我们需要为每个结果类型分别使用布尔类型,因为没有多态。
在Haskell中,当然可以定义仅由tru
或仅由fls
居住的类型(当然,每种类型也由undefined
居住);但这通常不是很有用。