2009-09-25 6 views
19

ランクの種類が大きいほど面白く見えます。 Haskell wikibookからこの例を付属しています。 Haskellで上位ランクのタイプを使用したことは何ですか?

foo :: (forall a. a -> a) -> (Char,Bool) 
foo f = (f 'c', f True) 

は、今、私たちは、コンパイラが爆発せずに foo idを評価することができます。この例題は、私がいくつかの場所で見た実世界の例であるSTモナドと runSTによって、本の中で素早く追跡されています。それはいいね。

しかし、私は、上位ランクの引数を使用して自分の関数を記述することによって問題を解決する状況にはまだ直面していません。あなたは?野生でランク2またはランクn多型の例はありますか?

答えて

7

Darcs sourcewithRepoLockのような機能を見てください。

Darcsは複数のリポジトリ形式をサポートしており、そのサポートはtypeclassで表されています。したがって、リポジトリ形式よりも一般的なコードを書くことができます。ディスク上のリポジトリを実際に読み取るときに、リポジトリの形式を把握し、適切なタイプクラスのインスタンス化を選択する一般的なコードを使用して、そのコードにディスパッチしたいとします。

3

上位ランクのタイプが役立つが、それを実現できなかった問題が発生した可能性があります。たとえば、Darcsの例では、ランク付けされた上位のタイプがなくても簡単に実装できました。その代わりに、呼び出し側がリポジトリ形式の関数の正しいインスタンス化を選択するなど、それらが準拠していることを確認しなければならない関数の前提条件があります。

上位ランクのタイプの利点は、この権利をプログラマからコンパイラに渡す責任を転送することです。従来のアプローチでは、Darcs開発者がリポジトリの種類を間違えた場合、結果は実行時エラーか破損データになります。上位ランクの型では、コンパイル時に型エラーが発生します。

8

WeirichとWashburnnの "Boxes go Bananas"! (paperslides

帰納的型を仮定すると、BGBでは、「正の」タイプの関数空間を表現することができます。ケース - その引数を弁別する多くの場合、他の値(通常は同じ型の値)の一部として引数を含みます。

Weirich + Washburnは、おそらくadequateハムズ計算のHOAS表現を-XRankNTypesハスケル(これはまだ十分であると証明されていますか?ランク2ポリモーフィック型の構造を「調べる」ことができないので、これは動作します

(forall g . GArrow g => g x y) 

(forall g . GArrow g => g() x -> g() y) 

をオンにする:

は、私はそれがhere(汚いコード警告)を使用しますそれができるのは、その引数をより大きな構造に「貼り付ける」ことだけです。いくつかのトリッキーでは、どこに貼り付けが行われたのかを把握して、貼り付けポイント(もしあれば)をGArrowの入力に戻します。

クラスでは、ハスケル関数空間全体がarrを介して "リーク"するので、これを行うことはできません。

関連する問題