键入lambda-based / church booleans的同义词

时间:2017-02-02 08:58:35

标签: haskell lambda

假设true(t)和false(f)定义如下:

> let t = \x -> \_ -> x
t :: t1 -> t -> t1
> let f = \_ -> \y -> y
f :: t1 -> t -> t

有没有办法定义一个可以捕获两个布尔值类型的类型同义词?

1 个答案:

答案 0 :(得分:5)

鉴于Church Booleans基本上要么选择第一个或第二个参数,要在

中使用它们
if' :: Boolean -> a -> a -> a
if' b tval fval = b tval fval

这样

if' t 1 0 == 1
if' f 1 0 == 0

您必须将类型限制为单个类型变量a

{-# LANGUAGE RankNTypes #-}

type Boolean = forall a. a -> a -> a

这是一个article that covers Church Booleans in Haskell in detail