13

上位の種類と上位の種類を理解するのに苦労しています。種類は非常に単純で(Haskellの文献に感謝します)、タイプについて話すとき、ランクは親切のようなものだと思っていましたが、明らかにそうではありません!ウィキペディアの記事を読んでも無駄になりました。それで、誰かがランクとは何かを説明できますか?上位ランクとはどういう意味ですか?上位のポリモーフィズム?それはどのように種類になりますか(もしあれば)?ScalaとHaskellを比較するのも素晴らしいでしょう。

4

1 に答える 1

14

ランクの概念は、種類の概念とはあまり関係がありません。

ポリモーフィック型システムのランクは、foralls が型のどこに現れるかを表します。ランク 1 の型システムforallでは、s は最も外側のレベルにのみ出現する可能性があり、ランク 2 の型システムでは、入れ子の 1 つのレベルに出現する可能性があります。

たとえばforall a. Show a => (a -> String) -> a -> String、ランク 1 のタイプとforall a. Show a => (forall b. Show b => b -> String) -> a -> Stringランク 2 のタイプになります。これら 2 つのタイプの違いは、最初のケースでは、関数の最初の引数は、表示可能な引数を 1 つ取り、文字列を返す任意の関数にすることができることです。したがって、タイプの関数はInt -> String有効な最初の引数 (仮想の function などintToString) になり、タイプの関数forall a. Show a => a -> String( などshow) も有効になります。2 番目のケースでは、 type の関数のみがforall a. Show a => a -> String有効な引数になります。つまり、問題ありませんがshowintToStringそうではありません。結果として、次の関数は 2 番目のタイプの正当な関数になりますが、最初のタイプ (++は文字列の連結を表すと想定されます)ではありません。

higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)

ここで、関数fは (潜在的に) 3 つの異なるタイプの引数に適用されることに注意してください。したがってf、関数の場合、これは機能intToStringしません。

Haskell と Scala はどちらもデフォルトでランク 1 です (したがって、上記の関数はこれらの言語では記述できません)。しかし、GHC には、Rank-2 ポリモーフィズムを有効にする言語拡張と、任意の n に対して Rank-n ポリモーフィズムを有効にする別の言語拡張が含まれています。

于 2012-11-10T00:32:49.350 に答える