下面,注释显示了term
命令的输出:
declare[[show_sorts]]
term "x"
(* "x::'a::{}" :: "'a::{}" *)
term "x::'a"
(* "x::'a::type" :: "'a::type" *)
在关于类型类的节标题中,我使用短语“nat to type”,当我的意思是“nat to”a“(我不使用,因为单词在标题中通常效果更好)
我需要简明扼要,但如果我也合理,技术上正确,那就更好了。
更新:在这里,我试着澄清一下我在问什么。我想我是这样说的:
我很困惑。命令term "x"
显示x
的类型为'a
,而'a
的类型为{}
。特别是事后看来,与term "x::'a"
相比,某种{}
并不是我对'a
所期望的。在这里,好像很多次,我会向软件寻求答案,当它告诉我'a
x
没有任何排序时,这让我感到奇怪。
因此,我最少给x
类型'a
,这导致'a
排序type
。这种答案对我有意义。并非'a
必须排序type
,但'a
至少应该排序,尽管我最初的动机是确保自己'a
类型class是排序type
。
从Lars的回答中,我想到类型推理引擎尽可能广泛地解释了一种类型,所以我认为这是其中的核心。
更新2
从Lars的附加评论中可以看出,至少在我看来,理解'a::{}
的关键词是“排序约束”,“排序约束”中的“约束”赋予{{{ 1}}。
对于那些有兴趣研究类型和种类语言的微妙之处的人来说,这里有一些资料来源:
{}
答案 0 :(得分:1)
排序是类型类的交集。因此,最常见的排序是完整排序,写为{}
(即空交集)。如果排序仅包含单个类,则省略花括号。
在Isabelle / HOL中,type
是一种HOL类型(与逻辑框架的类型相反,最明显的是命题类型prop
。所以,你通常使用的所有类型with(bool
,nat
,int
,对,列表,使用typedef或datatype定义的类型)将具有排序type
。
这保证了对象逻辑类型(例如,HOL)和逻辑框架(即Isabelle / Pure)之间的分离:逻辑框架的运算符可用于组成HOL表达式,但不能在HOL内部发生表达式。
因此,在Isabelle / HOL中工作时,您几乎总是希望表达式排序type
,因此type
被声明为默认排序,这意味着如果没有给出额外的约束,类型推断将使用它而不是空排序。
然而,由于类型推断设置的缺点(?),在一些罕见的情况下,类型推断仍然推断出空排序。这可能会产生令人惊讶的错误。