polymorphism - 修复语言环境扩展中的类型变量

标签 polymorphism isabelle type-variables

给定这段代码

locale A =
  fixes foo :: "'a"

locale B = A +
  fixes bar :: "'a × 'a"

locale C' = A +
  fixes baz :: "'a"
begin
  sublocale B foo "(foo, baz)".
end

我明白了

Type unification failed

Failed to meet type constraint:

Term:  (foo, baz) :: 'b × 'a
Type:  'b × 'b

看来伊莎贝尔不明白bazfoo 应该是同一类型。有办法解决这个问题吗?

最佳答案

问题出在您对区域设置 BC 的声明上。 B 的声明等同于以下内容

locale B = A foo for foo +
  fixes bar :: "'a * 'a"

Locales 导入只记住参数的名称,而不是类型变量的名称。因此,由于您没有指定 foo 的类型,B 的参数最通用的类​​型如下:

 foo :: 'b
 bar :: 'a * 'a

您可以使用命令 print_locale B 看到这一点。同样的情况也发生在语言环境 C 的声明中。

如果您希望foobar 具有相同的类型,则必须在语言环境声明中显式连接。有两种方法可以做到这一点。

locale B = A foo
  for foo :: 'a
  +
  fixes bar :: "'a * 'a"

locale B = A +
  constrains foo :: 'a
  fixes bar :: "'a * 'a"

关于polymorphism - 修复语言环境扩展中的类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26253538/

相关文章:

java - 如何强制使用其他风格的 Android Studio `see` 源代码,以便抽象类的重构更安全

c++ - 指向 vector 的变量

java - 多态性在 Java 中的方法参数中不起作用

math - Isabelle 中的归纳定义是有限生成的吗?

sml - 如何在Isabelle的ML级别轻松编写简单的策略?

haskell - 对于类型对齐的序列,我如何用 foldMap 来表达 foldr?

java - 检查一个对象是否属于Java中的一个类

isabelle - 如何为 map 定义构造谓词?

java - 如何在 Frege 中声明带有类型变量的 native 接口(interface)?

haskell - ScopedTypeVariables 无法与嵌套的 where 子句一起使用?