Scala 为什么不可能通过更高级的类型?

Scala 为什么不可能通过更高级的类型?,scala,scala-cats,Scala,Scala Cats,我正在读这本书,并试图理解猫的逆变现象。 在第68页,有一个在Cats中实现逆变的示例 我们可以使用Contravariant.apply方法调用Contravariant的实例。Cats为使用的数据类型提供实例 参数,包括Eq、Show和Function1。下面是一个例子: Show是一个typeclass而不是一个type,那么如何才能创建typeclass的typeclass逆变的实例呢?而且Show不是一种更高级的类型。类型类Show声明为 逆变声明为 如果我们这么说 Int具有种类*

我正在读这本书,并试图理解猫的逆变现象。
在第68页,有一个在Cats中实现逆变的示例

我们可以使用
Contravariant.apply
方法调用
Contravariant
的实例。Cats为使用的数据类型提供实例 参数,包括
Eq
Show
Function1
。下面是一个例子:


Show是一个typeclass而不是一个type,那么如何才能创建typeclass的typeclass
逆变的实例呢?而且
Show
不是一种更高级的类型。

类型类
Show
声明为

逆变
声明为

如果我们这么说

  • Int
    具有种类
    *
  • List[Int]
    具有种类
    *
  • 列表
    具有种类
    *->*
  • Monad
    声明为
    trait Monad[M[\u]]
    具有种类
    (*->*)->*
然后类推:

  • Show
    有种类
    *->*
  • Show[Int]
    有种类
    *
  • Contravariant
    具有种类
    (*->*)->*
  • 逆变[显示]
    有种类
    *
也就是说,
逆变
是一种接受
*->*
并产生某种
*
的东西。由于
Show
属于
*->*
类型,因此类型
逆变[Show]
有效

现在,在您的代码片段中,有一个表达式
逆变[Show]
。它不是一个类型,不应该与类型构造函数的应用程序混淆。Desugared,这东西本质上是

Contravariant.apply[Show](inst)
其中,
Contravariant
是类型,而
inst
是类型
Contravariant[Show]
的隐式提供实例。同样,一切都无缝地结合在一起

关于命名法的评论。我想说
Show
是一种“更高级的类型”。这并不是决定性的,但我喜欢[强调和代码缩进]中的以下引用:

此外,您可以拥有由更高种类的
类型参数化的种类。因此,某些东西不仅可以接受类型,还可以接受本身接受类型参数的东西。协变函子就是一个例子:函子[F[]],它的种类如下:

这表示:给定一个简单的高级类型,生成最终类型。例如,给定一个类似List的类型构造函数生成最终的类型函子[List]


从上面的引文可以明显看出,将
*->*
列表中的
*
类型称为“更高类型”至少是常见的。它肯定比
*
高。它肯定比当前版本的Java写的任何东西都要高(如果你用Java写
List
,你能得到的最好结果就是“废话废话泛型类型列表需要类型参数废话废话”-错误)。

类型类
Show
声明为

逆变
声明为

如果我们这么说

  • Int
    具有种类
    *
  • List[Int]
    具有种类
    *
  • 列表
    具有种类
    *->*
  • Monad
    声明为
    trait Monad[M[\u]]
    具有种类
    (*->*)->*
然后类推:

  • Show
    有种类
    *->*
  • Show[Int]
    有种类
    *
  • Contravariant
    具有种类
    (*->*)->*
  • 逆变[显示]
    有种类
    *
也就是说,
逆变
是一种接受
*->*
并产生某种
*
的东西。由于
Show
属于
*->*
类型,因此类型
逆变[Show]
有效

现在,在您的代码片段中,有一个表达式
逆变[Show]
。它不是一个类型,不应该与类型构造函数的应用程序混淆。Desugared,这东西本质上是

Contravariant.apply[Show](inst)
其中,
Contravariant
是类型,而
inst
是类型
Contravariant[Show]
的隐式提供实例。同样,一切都无缝地结合在一起

关于命名法的评论。我想说
Show
是一种“更高级的类型”。这并不是决定性的,但我喜欢[强调和代码缩进]中的以下引用:

此外,您可以拥有由更高种类的
类型参数化的种类。因此,某些东西不仅可以接受类型,还可以接受本身接受类型参数的东西。协变函子就是一个例子:函子[F[]],它的种类如下:

这表示:给定一个简单的高级类型,生成最终类型。例如,给定一个类似List的类型构造函数生成最终的类型函子[List]


从上面的引文可以明显看出,将
*->*
列表中的
*
类型称为“更高类型”至少是常见的。它肯定比
*
高。它肯定比当前版本的Java写下的任何东西都要高(如果你用Java写
List
,你能得到的最好结果就是“废话废话泛型类型列表需要类型参数废话废话”-错误)。

为什么
Show
不是更高级的类型?它声明为,它有一个类型参数
T
。问题是无效的。安德烈,
Show[T]
有种
*->*
。这被认为是更高级的,还是这种类型需要
(*->*)->*
才能被认为更高级?@earldouglas我已经在我的回答中提到了你的评论
((* -> *) -> *)