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)
この問題を回避し、一定の異種ストリームを定義する方法はありますか? 代わりに試してみるべき他の同様の構造はありますか?