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我已经在我的回答中提到了你的评论
((* -> *) -> *)