それで、私は最近、coinduction について少し読んでいて、今疑問に思っています: Haskell リストは帰納的ですか、それとも共帰納的ですか? Haskell ではこの 2 つを区別していないと聞いたことがありますが、もしそうなら、どのように正式に区別しているのでしょうか?
リストは帰納的に定義されますが、同時帰納的data [a] = [] | a : [a]
に使用できますones = a:ones
。無限リストを作成できます。それでも、有限リストを作成できます。それで、彼らはどれですか?
関連は Idris にあり、型List a
は厳密に帰納型であり、したがって有限リストのみです。Haskell での定義と同じように定義されています。ただし、Stream a
無限リストをモデル化する共導型です。として定義されています(というか、定義は同等です)codata Stream a = a :: (Stream a)
。無限のリストや有限のストリームを作成することはできません。しかし、定義を書くと
codata HList : Type -> Type where
Nil : HList a
Cons : a -> HList a -> HList a
Haskell のリストに期待する動作が得られます。つまり、有限構造と無限構造の両方を作成できます。
それでは、いくつかの核となる質問に要約してみましょう。
Haskell は誘導型と共誘導型を区別しませんか? もしそうなら、その公式化は何ですか?そうでない場合、[a] はどれですか?
HList は導帰的ですか? もしそうなら、どのようにして帰納型に有限値を含めることができますか?
を定義するとどうなる
data HList' a = L (List a) | R (Stream a)
でしょうか? それは何と考えられますか、そして/またはそれはただよりも役に立ちHList
ますか?