如何读取复杂的scala类型定义,如``type Pipe[F[\u],-I,+O]=Stream[F,I]=>Stream[F,O]```

如何读取复杂的scala类型定义,如``type Pipe[F[\u],-I,+O]=Stream[F,I]=>Stream[F,O]```,scala,generics,scala-cats,Scala,Generics,Scala Cats,类型管道[F[u3;],-I,+O]=流[F,I]=>流[F,O] 我理解F[3;],-I,+O。缺少的部分是右边的F。为什么不使用流[F[]]? 我猜左边和右边的F有不同的意思。关于编写类型定义的规则是否有官方文件 我检查流的类型 scala>:种类fs2.流 流的种类是X[+F[A1],+A2] 在另一种情况下: scala> trait Functor [F[_]] { | def map[A,B] (fn: A=>B)(fa: F[A]): F[B]

类型管道[F[u3;],-I,+O]=流[F,I]=>流[F,O]

我理解F[3;],-I,+O。缺少的部分是右边的F。为什么不使用流[F[]]? 我猜左边和右边的F有不同的意思。关于编写类型定义的规则是否有官方文件

我检查流的类型

scala>:种类fs2.流 流的种类是X[+F[A1],+A2] 在另一种情况下:

scala> trait Functor [F[_]] {
     |    def map[A,B] (fn: A=>B)(fa: F[A]): F[B]
     | }
trait Functor

scala> :kind Functor
Functor's kind is X[F[A]]
为什么F[A]不被F取代?当然,我对不同的概念感到困惑,但我应该在哪里学习它们呢

我猜左边和右边的F有不同的意思

更准确地说,左边和右边的下划线有不同的含义。前者表示匿名类型参数,而后者表示适当的通配符类型。Scala 3的未来版本最终应使其意义

它还删除了被用作类型参数的F[_]表示 F是一个类型构造函数,而用作类型时,F[u]表示它是一个 通配符,即存在类型。在未来,F[u]将意味着 同样的东西,不管在哪里使用

为了说明这一点,请考虑

scala> trait Foo[F[_]]
// defined trait Foo

scala> type Bar[F[_]] = Foo[F[_]]
1 |type Bar[F[_]] = Foo[F[_]]
  |                     ^^^^
  |         Type argument F[?] does not have the same kind as its bound [_$1]

scala> type Bar[F[_]] = Foo[F[?]]
1 |type Bar[F[_]] = Foo[F[?]]
  |                     ^^^^
  |         Type argument F[?] does not have the same kind as its bound [_$1]

scala> type Bar[F[_]] = Foo[([x] =>> F[x])[?]]
1 |type Bar[F[_]] = Foo[([x] =>> F[x])[?]]
  |                     ^^^^^^^^^^^^^^^^^
  |       Type argument F[Any] does not have the same kind as its bound [_$1]
请注意,右侧的下划线与

([x] =>> F[x])[?]
其中类型lambda[x]=>>F[x]应用于适当的类型?,这将导致适当的类型[x]=>>F[x][?]。但Foo是高阶类型构造函数,它期望另一个类型构造函数作为参数,而不是正确的类型。因此,以下工作

scala> type Bar[F[_]] = Foo[F]
// defined alias type Bar[F] = Foo[F]

scala> type Bar[F[_]] = Foo[[x] =>> F[x]]
// defined alias type Bar[F] = Foo[F]

注意lambda[x]=>>F[x]类型如何被未应用地传递给Foo。

type Pipe[F[\u],-I,+O]=Stream[F,I]=>Stream[F,O]可以被“读取”为type Pipe[[x]=>>F[x],-I,+O]=Stream[F,I]=>Stream[F,O]。对吗?这是比较平易近人的