2017-02-21 4 views
5

は、私がHistory of Haskellでいくつかのセクションを読んで、私が出会った:「高親和性多型」がどのようなタイプの問題を解決するのに役立ちますか?

をしかし、より高いkinded多型は、独立した有用性を持っている:それは高い種類の上にパラメータ化データ型を宣言するために、非常に便利な完全に可能であり、時折、以下のような:

「基本」のADTを知る
data ListFunctor f a = Nil | Cons a (f a) 

私は少しここに困惑して、私の「推測」括弧内の部分は、「パラメトリック」/「ダイナミック」単項データコンストラクタfことを示唆しているということでしたか?だからどのような種類のデータコンストラクタ* -> * "受け入れることができる"タイプa?私の思考は正しいのですか、あるいは私は構文を誤解していますか?私は「ただ推測」していることを知っていますが、ここでこの機能についての「レイ・プログラマ」の直感を得ることを期待しています。このシナリオを必要とするサンプル・シナリオは大部分が想像できます。正確な方法)これにより、Haskellがそのような喜びを作って、evalsを閉じるようにしているそれらの「小さな埋め込み多目的再帰設定言語」-ADTにもっと柔軟に対応できます。上記のGHCiの、:i ListFunctor

が与える:

type role ListFunctor representational nominal 
data ListFunctor (f :: * -> *) a = Nil | Cons a (f a) 

だから、これは鮮明data宣言から「推論」何のようです。

答えて

11

はい、fは、任意の単一型コンストラクタにすることができます。

たとえば、ListFunctor [] IntまたはListFunctor Maybe Charはよく分類されます。

fは、(n-1)個の引数が部分的に適用されたn-ary型のコンストラクタでもあります。

例えば、ListFunctor ((->) Bool) IntまたはListFunctor (Either()) Charはよく分類されます。

基本的なキングシステムは非常に簡単です。 F :: * -> * -> ... -> *の場合、Fには型引数が必要です。 G :: (* -> *) -> *の場合、Gは、上に示したものと同じ種類のコンストラクタと部分アプリケーションを含む種類が* -> *であると想定しています。等々。


より高い種類によってうまく解決される問題は、設定オプションです。レコードがあると仮定してください

ここで、構成設定はファイルにあり、コマンドラインおよび/または環境変数に渡されます。これらすべての設定ソースの解析中に、すべてのソースがすべてのオプションを定義するわけではないという事実に対処する必要があります。したがって、構成設定のサブセットを表現するために、より緩慢なタイプが必要です。

data TempOpt = TempOpt 
    { tempOpt1 :: Maybe Bool 
    , tempOpt2 :: Maybe String 
    -- many other fields here 
    } 

-- merge all options in one single configuration, or fail 
finalize :: [TempOpt] -> Maybe Opt 
... 

すべてのオプションを複製するので、これは恐ろしいことです! Optタイプを削除し、乱雑さを減らすためには、より弱いTempOptを使用するようにします。しかしこれを行うことによって、最初の設定処理部分の後でさえ、我々のプログラム内のオプションの値にアクセスする必要があるたびにfromJustのような部分アクセサーを使う必要があります。

私たちは、代わりに高い種類に頼ることができます。

data FOpt f = FOpt 
    { opt1 :: f Bool 
    , opt2 :: f String 
    -- many other fields here 
    } 
type Opt = FOpt Identity 
type TempOpt = FOpt Maybe 

-- as before: merge all options in one single configuration, or fail 
finalize :: [TempOpt] -> Maybe Opt 
... 

これ以上の重複。 finalizeの設定が完了したら、設定が常に存在するという静的な保証が得られます。危険なfromJustの代わりにの合計アクセサーrunIdentityを入手することができます。

+0

この容量の可能性を把握するための素晴らしい説明とうまく「現実の」シナリオ---多くの義務的な@chi! – metaleap

関連する問題