Haskellが[[]](リストのリスト)の種類を解決できないのはなぜですか?
Intのような型を指定して、種類*の[[Int]]を取得できるので、単純に*->*ではないのはなぜですか。
2 に答える
8
Maybe Maybe
後者の場合、理由はおそらくより明確ですが、私はそれがと同じだと思います:「外部」型構築子は種類の型が渡されることを期待しますが、型の*
型構築子* -> *
(「内部」Maybe
/ []
)を見て文句を言います。私が正しければ、これは:kind
GHCiの機能の問題ではなく、より種類の多い型構築子の構成を表現するための正しい構文を見つけることの問題です。
回避策として、
:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
使用できます(適切な言語拡張機能をオンにして- ExistentialQuantification
、私は-forall
構文を有効にします)。
于 2010-06-08T05:00:00.453 に答える
4
そのように脱糖[[]]
すると[] []
、それが不十分な種類であることが明らかです[] :: * -> *
。
実際に「リストのリスト」が必要な場合は、種類の2つの型構築子を作成する必要があります* -> *
。Haskellにはタイプレベルのラムダがないため、少し定型文がないとそれを行うことはできません。ただし、これは可能です。
newtype Comp f g a = Comp { unComp :: f (g a) }
今、あなたは書くことができます:
type ListList = Comp [] []
そしてそれを使って関数を書く:
f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp
このようなファンクター構成は、いくつかの分野、特にSwierstraの「データ型アラカルト」に適用されます。
于 2010-08-13T09:03:38.330 に答える