2012-05-08 8 views

答えて

5

そうしてはいけません。

値と機能に類推することができます。基本値は5"foo"などの関数ではありません。単純な関数を引数として取り、簡単な値を返します(+lengthなど)。高次関数は、他の関数をパラメータまたは結果として持つ関数です。例えば、takeWhile,mapまたはfoldLeftは高次関数である。

あなたは値の実際の型でシンプルなタイプ、などIntStringがあり、種類を検討し、あるいはInt => Stringとした場合一覧[ダブル](今私は関数を含む、単純またはなく、すべての値を、考えます) 。次に、タイプコンストラクタと呼ばれることもあるパラメータ型があります(型関数を呼び出すと、類推がより明確になります)。リストは(genericパラメータをインスタンス化せずに)実際には値の型ではなく、valの型をちょうどListと宣言することはできません。List[Something]でなければなりません。したがって、Listは、単純な型(Int)が別の単純な型(List [Int])を返す関数として考えることができます。 Int,StringおよびDoubleおよびInt => Stringは、種類*と言い、Listは種類* -> *です。 ListまたはMapなどのパラメトリックタイプは、単純な関数と類似しています。

高次関数は(単純値の代わりに)関数を持つ関数と同様に、単純型パラメータではなく、型コンストラクタパラメータを持つ型です。それは種類(* -> *) -> *、または何かより複雑です。タイプパラメータCはそれ自体がパラメトリックタイプまたはタイプコンストラクタであることを伝えるために、HigherOrder[C[_]]またはHigherOrder[C[X]]と宣言されています。これは型の宣言ではなく、型のインスタンス化でなければならないことに注意してください。 Listは、形質List[A]と宣言されているため、パラメトリックですが高次ではありません。 List[Seq[Map[Int, Set[Double]]]でインスタンス化すると、Listのオーダーはそれ以上高くなりません。高次型は、(List[Int]ではなく)をパラメータとして受け取り、val x : HigherOrder[List] = ...と宣言することができます。

高次タイプはライブラリではあまり一般的ではありませんが、コレクションライブラリの詳細については、GenericCompanionなどをご紹介ください。あなたはscalazでそれらの多くを見つけることができます。

9

あなたが持っているものは、より高潔なタイプではありませんが、それはかなり簡単に変更することができます。

type MyMap2[A,B,C] = Map[A, List[Map[B, C]]] 

タイプパラメータを指定することで、MyMapを再度作成できます。

type MyMap = MyMap2[String, Int, String] 

「高-kindedは」ちょうどそれが無人であるタイプであることを意味し、居住タイプを作成するために、他の種類を設ける必要があります。

関連する問題