首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不可能通过更高的类型?

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

Stack Overflow用户
提问于 2018-02-07 08:44:24
回答 1查看 137关注 0票数 0

我正在读“猫”( https://underscore.io/books/scala-with-cats/ )一书,并试图理解“猫”中的反变体。

在第68页中,有一个在猫中实现对比变体的例子。

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

代码语言:javascript
复制
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并不是较高的类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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]。它不是类型,也不应该与类型构造函数的应用程序混淆。德斯加里德,这件事本质上是

代码语言:javascript
复制
Contravariant.apply[Show](inst)

其中ContravariantContravariantinst是隐式提供的Contravariant[Show]类型实例。再一次,一切都完美地结合在一起。

关于术语的评论。,我想说Show是一个“更高的种类”。这绝不是确定的,但我喜欢以下引用的亚特兰西岛博客强调和代码缩进我

此外,还可以有由更高类型的类型参数化的类型。因此,某些东西不仅可以接受类型,还可以接受本身具有类型参数的内容。一个例子是协变函子: Functor[F_],它有这样的类型:

代码语言:javascript
复制
((* -> *) -> *)

这说明:给定一个简单的更高类型的,生成最终的类型。例如,给定类型构造函数(如List ),将生成最终类型的FunctorList。

从上面的引文中可以明显看出,将* -> * of List称为“高等类”至少是常见的。它肯定比*高。它肯定比在当前版本的Java中编写的任何东西都高(如果用Java编写List,您可以得到一个"blah -泛型类型列表需要类型参数blah"-error)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48659350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档