[A: C] 和 [A[_]: C] 上下文边界之间的区别
Difference between [A: C] and [A[_]: C] context bounds
我是新手,根据我的讲座:
class Test [T: Comparing]
意味着它需要一个 Comparing[T]
类型的隐式值,可以在 class 的方法中使用。
使用这种高级类型符号
问题:这个表达式 def notation[F[_]: Sync] : F[Unit] = ???
指的是什么?
考虑具体类型和类型的区别构造函数
Int // concrete type
List[Int] // concrete type
List // type constructor
我们使用符号 F[_]
表示类型构造函数的形状
trait Foo[T] // Foo takes any type
trait Bar[F[_]] // Bar takes any type constructor
new Foo[Int] {} // ok
new Foo[List[Int]] {} // ok
new Foo[List] {} // error
new Bar[Int] {} // error
new Bar[List[Int]] {} // error
new Bar[List] {} // ok
我们可以将类型参数子句 [F[_]: Bar]
理解为
- 方法需要类型
Bar[F]
的隐式值,其中 F
是类型构造函数
- 类型构造函数
F
必须是类型类 Bar
的 member
trait Bar[F[_]]
// make type constructor Foo a member of typeclass Bar
implicit val barOfFoo: Bar[Foo] = new Bar[Foo] { println("woohoo") }
def g[F[_]: Bar] = implicitly[Bar[F]]
g[Foo] // ok
g[Int] // error - type parameter is of incorrect shape
g[Foo[Int]] // error - type parameter is of incorrect shape
g[List] // error - type parameter is of correct shape but not a member of Bar
将上述概念应用于 def notation[F[_]: Sync]
我们看到类型构造函数 F
必须是类型类 Sync
的成员才能调用 notation
.
我是新手,根据我的讲座:
class Test [T: Comparing]
意味着它需要一个 Comparing[T]
类型的隐式值,可以在 class 的方法中使用。
使用这种高级类型符号
问题:这个表达式 def notation[F[_]: Sync] : F[Unit] = ???
指的是什么?
考虑具体类型和类型的区别构造函数
Int // concrete type
List[Int] // concrete type
List // type constructor
我们使用符号 F[_]
trait Foo[T] // Foo takes any type
trait Bar[F[_]] // Bar takes any type constructor
new Foo[Int] {} // ok
new Foo[List[Int]] {} // ok
new Foo[List] {} // error
new Bar[Int] {} // error
new Bar[List[Int]] {} // error
new Bar[List] {} // ok
我们可以将类型参数子句 [F[_]: Bar]
理解为
- 方法需要类型
Bar[F]
的隐式值,其中F
是类型构造函数 - 类型构造函数
F
必须是类型类Bar
的 member
trait Bar[F[_]]
// make type constructor Foo a member of typeclass Bar
implicit val barOfFoo: Bar[Foo] = new Bar[Foo] { println("woohoo") }
def g[F[_]: Bar] = implicitly[Bar[F]]
g[Foo] // ok
g[Int] // error - type parameter is of incorrect shape
g[Foo[Int]] // error - type parameter is of incorrect shape
g[List] // error - type parameter is of correct shape but not a member of Bar
将上述概念应用于 def notation[F[_]: Sync]
我们看到类型构造函数 F
必须是类型类 Sync
的成员才能调用 notation
.