类型注释被推断的表达式类型覆盖

2024-01-23

在 Scala 编程语言中,假设我将使用更广泛的类型注释表达式并提供一个狭窄的值,我的程序将被拒绝:

scala> def x[A](): A = 8 
<console>:11: error: type mismatch;
found   : Int(8)
required: A
      def x[A]() = 8: A

而在 ocaml 中,当我执行相同操作时,程序会被接受,但表达式的类型注释会被较窄表达式的类型覆盖。

utop # let x (): 'a = 8 ;;
val x : unit -> int = <fun>

这些类型系统之间有什么区别,导致出现这样的情况:在一种情况下程序被拒绝,而在另一种情况下程序被接受?


@craigfe 实际上刚刚写了一个非常容易访问的帖子 https://www.craigfe.io/posts/polymorphic-type-constraints/昨天关于这个,我强烈建议您阅读该内容。

但简短的答案是 OCaml 注释中的类型变量是统一变量,而不是多态类型约束。它们表示编译器要推断的未知类型,编译器会更喜欢更通用的解决方案,并可能推断它是多态的,但如果不可能,则会推断它是特定类型。

为了获得您期望的行为,您必须明确指示类型变量应该使用通用量化'a.,通常读作“对于所有a”:

utop # let x: 'a. unit -> 'a = fun () -> 8 ;;
                               ^^^^^^^^^^^
Error: This definition has type unit -> int which is less general than
         'a. unit -> 'a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型注释被推断的表达式类型覆盖 的相关文章

随机推荐