我了解如何在 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)
有什么办法可以解决这个问题并定义恒定的异构流?我应该尝试其他类似的结构吗?