我正在读“猫”( https://underscore.io/books/scala-with-cats/ )一书,并试图理解“猫”中的反变体。
在第68页中,有一个在猫中实现对比变体的例子。
我们可以使用
Contravariant方法调用Contravariant.apply实例。Cats为使用参数(包括Eq、Show和Function1)的数据类型提供实例。下面是一个例子:
import cats.Contravariant
import cats.Show
import cats.instances.string._
object ContraCats {
val showString = Show[String]
val showSymbol = Contravariant[Show]
.contramap(showString)((sym: Symbol) => s"'${sym.name}'")
def main(args: Array[String]): Unit = {
println(showSymbol.show('dave))
}
}Show是类型而不是类型,那么如何创建类型类Contravariant的实例呢?而Show并不是较高的类型。
发布于 2018-02-07 17:31:04
类型类型Show被声明为Show[T]。
Contravariant被声明为Contravariant[F[_]]
如果我们这么说
Int有善良的*List[Int]有善良的*List有善良的* -> *Monad声明为trait Monad[M[_]]有善良的(* -> *) -> *然后类推:
Show有善良的* -> *Show[Int]有善良的*Contravariant有善良的(* -> *) -> *Contravariant[Show]有善良的*也就是说,Contravariant是一个采用* -> *并产生某种*的东西。由于Show是* -> *类型,所以Contravariant[Show]类型是有效的。
现在,在您的代码片段中,有一个表达式Contravariant[Show]。它不是类型,也不应该与类型构造函数的应用程序混淆。德斯加里德,这件事本质上是
Contravariant.apply[Show](inst)其中Contravariant是Contravariant,inst是隐式提供的Contravariant[Show]类型实例。再一次,一切都完美地结合在一起。
关于术语的评论。,我想说Show是一个“更高的种类”。这绝不是确定的,但我喜欢以下引用的亚特兰西岛博客强调和代码缩进我
此外,还可以有由更高类型的类型参数化的类型。因此,某些东西不仅可以接受类型,还可以接受本身具有类型参数的内容。一个例子是协变函子: Functor[F_],它有这样的类型:
((* -> *) -> *)这说明:给定一个简单的更高类型的,生成最终的类型。例如,给定类型构造函数(如List ),将生成最终类型的FunctorList。
从上面的引文中可以明显看出,将* -> * of List称为“高等类”至少是常见的。它肯定比*高。它肯定比在当前版本的Java中编写的任何东西都高(如果用Java编写List,您可以得到一个"blah -泛型类型列表需要类型参数blah"-error)。
https://stackoverflow.com/questions/48659350
复制相似问题