2012-05-08 2 views

ответ

5

Не следует.

Вы можете сделать аналогию со значениями и функциями. У вас есть базовые значения, которые не являются функциями, такими как 5 и "foo". У вас есть простые функции, которые принимают простые значения в качестве аргументов и возвращают простые значения, такие как + или length. Функции более высокого порядка - это функции, которые имеют другие функции в качестве параметров или результата. Например, takeWhile, map, или foldLeft - функции более высокого порядка.

Если вы считаете, типов, есть простые типов, которые являются фактическими типами значений, такими как Int, String, или даже Int => String и List [Double] (теперь я считаю каждые значения, простых или нет, в то числе функции) , Тогда существуют параметрические типы, которые также могут называться конструкторами типов (называть их функциями типа, чтобы сделать аналогию более четкой). Список (без создания стандартного параметра) на самом деле не является типом значений, вы не можете объявить значение val только типа List, оно должно быть List[Something]. Таким образом, List можно рассматривать как функцию, которая задает простой тип (например, Int), возвращает другой простой тип (List [Int]). Int, String и Double и Int => Строка, как говорят, вид*, в то время как List имеет вид * -> *. Параметрические типы, такие как List или Map, аналогичны простым функциям.

Как функция более высокого порядка является функцией с параметром функции (вместо простого значения), тип более высокого порядка (или иногда более высокий) является типом, который имеет параметр конструктора типа, а не просто параметры простого типа. Он имеет вид (* -> *) -> *, или что-то более сложное. Они объявляются с HigherOrder[C[_]] или HigherOrder[C[X]], чтобы сообщить, что параметр типа C сам по себе является параметрическим типом или конструктором типов. Обратите внимание, что это должно появиться в объявлении типа, а не в экземпляре типа. List объявлен признаком List[A], поэтому он параметрический, но не более высокий. Если вы инициируете один с List[Seq[Map[Int, Set[Double]]], это не будет делать List 's любой порядок. Тип более высокого порядка принимал бы List (а не List[Int]) в качестве параметра, можно было бы объявить val x : HigherOrder[List] = ....

Более высокие типы заказов не слишком распространены в библиотеке, вы можете обнаружить несколько в деталях библиотеки коллекции, таких как GenericCompanion. Их можно найти в скалясе.

9

То, что у вас есть, не является более высокоподобным, но его можно было бы легко изменить, чтобы быть таким.

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

Теперь мы можем создать MyMap снова, обеспечивая параметры типа.

type MyMap = MyMap2[String, Int, String] 

«Высшее kinded» просто означает, что тип, который является необитаемым, и должно быть обеспечено с другими типами в целях создания обитаемого типа.