我发现record ⦇ field := value ⦈
符号在我用它来改变过程中record
的类型参数时,没有按预期工作。为了澄清我的意思,请考虑以下示例:
theory Scratch imports
Main
begin
record 'a john =
apple :: 'a
banana :: int
definition f :: "nat john ⇒ bool john"
where
"f j ≡ j ⦇ apple := True ⦈"
definition f_fixed :: "nat john ⇒ bool john"
where
"f_fixed j ≡ ⦇ apple = True, banana = banana j ⦈"
end
由于类型错误,不接受f
的定义。似乎我不能使用字段更新来更改基础记录的类型。我对此感到有些惊讶,因为f_fixed
看起来非常相似,但工作得非常好。我做错了什么,或者这是一个已知的限制?
答案 0 :(得分:2)
这是一个已知的限制。
语法j⦇ apple := True ⦈
是john.apple_update (λ_. True) j
的简写,其中函数apply_update
的类型为:
('a ⇒ 'a) ⇒ 'a john ⇒ 'a john
(第一个参数是一个传递旧值apple
的函数并返回一个新值。因为你无条件地将字段更新为True
,你的函数是(λ_. True)
。)
此功能的类型可防止类型'a
在更新期间发生变化。您可能正在寻找的是具有以下类型的更新功能:
('a ⇒ 'b) ⇒ 'a john ⇒ 'b john
发布此类功能的一个可能的复杂因素是以下情况:
record 'a john =
apple :: 'a
banana :: 'a
apple_update
的类型应该是什么?如果不同时更改apple
的类型,则无法更改banana
的类型。
同样,没有技术理由为什么记录包无法发出这样的函数,只需要确定在各个角落发出的正确函数是什么例。