假设我有一个无限的动作序列,每个动作都返回某种类型的结果。就像是:
newtype Stream a = Stream (IO (a, Stream a))
但随着a
时间的推移而变化。我想强烈输入这个序列。对于任意无限类型序列和幼稚的方法,这显然没有意义,例如:
data HStream :: [u] -> * where Cons :: Proxy x -> HStream xs -> HStream (x ': xs)
infiniteInt = Cons (Proxy :: Proxy Int) infiniteInt
将导致无限类型,这是 Haskell 的类型系统不支持的。但是我认为final-periodic HLists 没有任何问题(即,这种类型的序列会从某个点重复自身:)[Bool, Int, Int, Sting, Int, Sting, Int, Sting ... ]
。而且我还认为,如果我们有某种强烈的规范化方式来描述无限类型或某种方式来提供可以在有限步数中检查的无限类型相等性的证据,那么应该可以对具有这种无限类型的程序进行类型检查。
有谁知道如何在 Haskell 中表示和使用这些类型?现在让我们从无限最终周期 hlist 开始,但如果有人知道如何将它推广到更广泛的无限 tupes 类以及泛化限制在哪里,我将不胜感激。