在Haskell中实现Lambda Calculus true和false

时间:2017-09-09 16:50:10

标签: haskell lambda-calculus

也许这是一个微不足道的问题,我只是没有正确地思考它。如果是的话,我很抱歉。

我想在Haskell中实现lambda calculus true和false函数,然后使用它们来实现if-then-else。这就是我的所作所为。

true :: t1 -> t2 -> t1
true x y =  x

false :: t1 -> t2 -> t2
false x y = y

-- ifThenElse :: (t2 -> t1 -> t) -> t2 -> t1 -> t
ifThenElse cond thenPart elsePart =  cond thenPart elsePart

注释掉的ifThenElse类型是GHC生成的类型。我担心的是,该类型中的t应该被限制为t1t2。我可以为ifThenElse写一个完成此操作的类型吗?

1 个答案:

答案 0 :(得分:0)

你想要这些:

{-# LANGUAGE RankNTypes #-}
-- These are the only two values of this type...
true  :: l -> r -> Either l r
false :: l -> r -> Either l r
true  l _ = Left  l
false _ r = Right r

-- ...and they are the only possible arguments here.
ifThenElse :: (forall l r. l -> r -> Either l r) -> l -> r -> Either l r
ifThenElse = id

如果你想要不同的左右类型,那么Either就不可能了。