这里是我遇到问题的代码:
{-# LANGUAGE GADTs, LANGUAGE DataKinds #-}
-- * Universe of Terms * --
type Id = String
data Term a where
Var :: Id -> Term a
Lam :: Id -> Type -> Term b -> Term (a :-> b)
App :: Term (a :-> b) -> Term a -> Term b
Let :: Id -> Term a -> Term b -> Term b
Tup :: Term a -> Term b -> Term (a :*: b) -- * existing tuple
Lft :: Term a -> Term (a :+: b) -- * existing sum
Rgt :: Term b -> Term (a :+: b)
Tru :: Term Boolean
Fls :: Term Boolean
Bot :: Term Unit
-- * Universe of Types * --
data Type = Type :-> Type | Type :*: Type | Type :+: Type | Boolean | Unit
所以我想将Tup
扩展到可以定义任意数量的参数,与sum相同。但涉及到列表的公式会将最终项限制为一种类型的a:
因此,我希望能够对Tup
和sum函数进行扩展,使它们能够适用于任意数量的参数。然而,如果涉及到列表的表达式,最终的结果可能会被限制为特定类型的a。
Sum :: [Term a] -> Term a
我可以只删掉a
标签,然后做这样的事情:
Sum :: [Term] -> Term
但这样我就失去了我试图表达的东西。
那么,我如何在不损失表现力的情况下表达多态项?
Tup
已经形成了一个乘积类型。同样地,你可以为二元求和类型创建Lft :: Term a -> Term (a :+: b)
和Rgt :: Term b -> Term (a :+: b)
。当然,还需要将Type :+: Type
加入到你的类型集合中。 - kosmikusUnt :: Term Unit
。 - augustss