無限の一連のアクションがあり、それぞれが特定の型の結果を返すとしましょう。何かのようなもの:
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 の型システムではサポートされていない無限型になります。しかし、最終的に周期的な HLists (つまり、ある時点からどのような型シーケンスが繰り返されるかなど) に問題はないと思います: [Bool, Int, Int, Sting, Int, Sting, Int, Sting ... ]
)。また、無限型を記述するための強力な正規化方法や、有限数のステップでチェックできる無限型の等価性の証拠を提供する方法があれば、そのような無限型を含むプログラムを型チェックできるはずです。
そのような型をHaskellでどのように表現して使用できるか、誰にもわかりませんか? 今のところ、無限の最終的に周期的な hlist から始めましょう。ただし、より広いクラスの無限の tupes に対して一般化する方法と、一般化の制限がどこにあるのかについて誰かが考えを持っている場合にも感謝します。