也许这是一个微不足道的问题,我只是没有正确地思考它。如果是的话,我很抱歉。
我想在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
应该被限制为t1
或t2
。我可以为ifThenElse
写一个完成此操作的类型吗?
答案 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
就不可能了。