Scala 类型推理混乱:有还是没有?

2023-11-21

原始版本:

  trait Animal[F[_], A]
  case class Cat[F[_], I, A](limits: F[I], f: I => A) extends Animal[F,A]

  object  ConfuseMe {
    def confuse[F[_], A](tt: Animal[F, A]) = tt match {
      case Cat(_, f) => f
    }
  }

修改版本:

  trait Animal[A]
  case class Cat[I, A](f: I => A) extends Animal[A]

  object  ConfuseMe {
    def confuse[A](tt: Animal[A]) = tt match {
      case Cat(f) => f
    }
  }

如果F是List,原始版本的函数混淆将被推断为Any => A类型。默认情况下,修改后的版本将被推断为 Nothing => A 类型。为什么它们不都是 IntelliJ IDE 所暗示的 Nothing => A 类型?我完全糊涂了。

其他有趣的例子:

  trait Trampoline[+A]
  case class Done[+A](get: A) extends Trampoline[A]
  case class More[+A](force: () => Trampoline[A]) extends Trampoline[A]
  case class Bind[I,+A](force: () => Trampoline[I], f: I => Trampoline[A]) extends Trampoline[A] 

似乎一旦我们在这里对类型“I”有了约束(类型构造函数)“Trampoline”,我们就有话要说“I”,就像类型“I”具有“F”属性(它可以是任何类型构造函数? ),所以它会被 Scala 编译器推断为“Any”(它不会进一步类型检查类型构造函数“F”来收集有关“I”的更多信息,因此它只是给它“Any”,因为它不够智能)否则它就会被标记为“没什么”,就像我们无话可说一样。然而,我对此并不确定,仍然陷入困惑。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 类型推理混乱:有还是没有? 的相关文章

  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • Scala 中的 Apply 和 lambda

    我有下面的代码 scala gt val builder new StringBuilder foo bar baz builder StringBuilder foo bar baz scala gt 0 until 5 foreach
  • Scala:将整个列表的 Either 与每个元素的 Either 组合

    我有一个 Either 列表 它代表错误 type ErrorType List String type FailFast A Either ErrorType A import cats syntax either val l List
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • 使用 Intellij 2017.2 /out 目录构建会重复 /build 目录中的文件

    更新到 Intellij 2017 2 后 构建我的项目会创建一个 out包含生成的源文件和资源文件的目录 这些文件与已包含的文件重复 build并导致duplicate class生成的类的编译器错误 关于 Gradle 或 Intell
  • Swift 中使用 T 型进行泛型调用

    在我的应用程序中 我想创建一个通用方法 该方法根据给定类型 T 创建一个对象数组 我创建了以下函数 func getArray
  • SBT 对 Scala 类型感到困惑

    SBT 抛出以下错误 value split is not a member of String String error filter arg gt arg split delimiter length gt 2 对于以下代码块 impl
  • 按元素聚合数组

    Spark scala 相当新 我想知道是否有一种简单的方法以按列方式聚合 Array Double 这是一个例子 c1 c2 c3 1 1 1 0 1 0 3 4 1 2 1 0 0 0 4 3 2 1 0 0 0 0 0 0 2 3 1
  • Scala 匿名函数中的 return 语句

    为什么显式 return 语句 使用return关键字 在匿名函数中从封闭的命名函数返回 而不仅仅是从匿名函数本身返回 例如 以下程序会导致类型错误 def foo String x Integer gt return x foo 我知道建
  • 使用 Gradle 检测 IDE 环境

    无论如何 有没有办法检测我正在运行我的项目的环境 像这样的事情 构建 gradle def usingIntelliJ def usingAndroidStudio if usingIntelliJ buildConfigField Str
  • 将 DOCTYPE 添加到 Scala XML 的最简单方法?

    我怎样才能在 Scala XML 中制作这个最小的 HTML5 p p 当然 在 Scala 中制作类似 HTML 的 XML 很简单 gt val html p p html scala xml Elem p p 但是 我怎样才能注入DO
  • WSClient - 打开的文件太多

    我正在 CentOS 6 上使用 Play Framework 2 4 我的应用程序抛出此异常 java net SocketException Too many open files 我在 Stack Overflow 上搜索了很多主题并
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • Scala 中用于阻止调用的 Future

    The Akka文档说 you may be tempted to just wrap the blocking call inside a Future and work with that instead but this strate
  • 无法从用法推断方法的类型参数

    也许我工作过度了 但这没有编译 CS0411 为什么 interface ISignatur
  • Scala 隐式转换范围问题

    采取这个代码 class Register var value Int 0 def getZeroFlag Boolean value 0x80 0 object Register implicit def reg2int r Regist
  • Scala 中的高级类型 [重复]

    这个问题在这里已经有答案了 我正在阅读 Scala 中的函数式编程一书 在 Monoids 章节中 他们讨论了 Monoid 接口 如下所示 trait Monoid A def op a1 A a2 A A def zero A 后来 他
  • 如何在每行中添加行号?

    假设这些是我的数据 Maps and Reduces are two phases of solving a query in HDFS Map is responsible to read data from input location
  • Spark scala:大量列上的简单 UDF 会导致性能下降

    我有一个包含 1 亿行和约 10 000 列的数据框 这些列有两种类型 标准 C i 和动态 X i 这个dataframe是经过一些处理后得到的 性能很快 现在只剩下2步了 Goal 需要使用 C i 列的相同子集对每个 X i 执行特定

随机推荐