Конструктор типа, ограниченный правильным типом - PullRequest
2 голосов
/ 18 июня 2020

Рассмотрим следующее предложение параметра типа [F[_] <: Int] в

def h[F[_] <: Int] = ???

, где конструктор типа F ограничен правильным типом Int. Теперь и h[List], и h[Int] недопустимы

scala> def h[F[_] <: Int] = ???
     |
def h[F[_] <: Int]: Nothing

scala> h[List]
        ^
       error: type arguments [List] do not conform to method h's type parameter bounds [F[_] <: Int]

scala> h[Int]
         ^
       error: Int takes no type parameters, expected: 1

так почему же тогда [F[_] <: Int] законно?

1 Ответ

5 голосов
/ 18 июня 2020

Объявление параметра типа F[_] <: Int означает, что каждый экземпляр F должен быть подтипом Int. Это правильно в синтаксисе, хотя crypti c: F не обязательно должен быть подтипом Int; F[_] должен быть подтипом Int (для всех типов, которые могут быть помещены в _). Примером такого F является тот, который всегда возвращает Int:

type ConstInt[X] = Int
h[ConstInt] // compiles

Обратите внимание, что вы можете указать тип в _. Например, я могу объявить параметр типа F[X] <: X. X является локальным по отношению к объявлению, определяется появлением под F слева, используется как граница справа и впоследствии выходит за пределы области видимости. Этот пример означает, что F[X] должен быть подтипом X, например, как

def f[F[X] <: X] = ???
type Identity[X] = X
f[Identity] // works
type ConstNothing[X] = Nothing
f[ConstNothing] // works
// f[ConstInt] (ConstInt[X] = Int is not always a subtype of X; counterexample X = AnyRef)

Возможно, это помогает понять, что должна означать граница.

...