9

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)

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

4

1 に答える 1