我了解如何在Haskell中定义同质和异质流。
-- Type-invariant streams.
data InvStream a where
(:::) :: a -> InvStream a -> InvStream a
-- Heterogeneous Streams.
data HStream :: InvStream * -> * where
HCons :: x -> HStream xs -> HStream (x '::: xs)
我们如何定义一个常量流作为异构流的一种特殊情况?如果我试图定义一个指定类型的流类型族,我会得到一个“减少堆栈溢出”错误。我想这与类型检查算法不够懒惰并尝试计算整个类型为
Constant a
的流有关。type family Constant (a :: *) :: InvStream * where
Constant a = a '::: Constant a
constantStream :: a -> HStream (Constant a)
constantStream x = HCons x (constantStream x)
有没有什么方法可以规避这个问题并定义常量异构流?还有其他类似的结构我应该尝试吗?