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

der*_*ink 4 lambda haskell

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

> let t = \x -> \_ -> x
t :: t1 -> t -> t1
> let f = \_ -> \y -> y
f :: t1 -> t -> t
Run Code Online (Sandbox Code Playgroud)

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

Zet*_*eta 5

鉴于教会布尔基本上要么选择第一个或第二个参数,并且你想在类似的东西中使用它们

if' :: Boolean -> a -> a -> a
if' b tval fval = b tval fval
Run Code Online (Sandbox Code Playgroud)

这样的

if' t 1 0 == 1
if' f 1 0 == 0
Run Code Online (Sandbox Code Playgroud)

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

{-# LANGUAGE RankNTypes #-}

type Boolean = forall a. a -> a -> a
Run Code Online (Sandbox Code Playgroud)

下面是一个涵盖教会布尔在Haskell详细文章.