当我在列表理解中使用(_,_)
模式时,我收到一个奇怪的警告。我的最小工作示例如下。
theory Misc imports
Main
"~~/src/HOL/Library/Code_Target_Numeral"
begin
definition "xys = [(1::int,2::int),(2,3),(3,4)]"
value "[x+4. (x,_) ← xys]"
end
一切似乎都运转良好,但我收到了警告
以下条款是多余的(由前面的条款涵盖):
x⇒[]
我应该担心吗?
答案 0 :(得分:3)
无需担心。
语法
[a+4. (a, b) ← xys]
在内部翻译为
concat (map (λx. case x of (a, b) ⇒ [a + 4] | _ ⇒ []) xys)
(请参阅"列表理解" HOL/List.thy
)。
这里发生的事情是,如果您的模式(a, b)
匹配,它将映射到您的表达式a + 4
(case
表达式的前半部分)。如果它不匹配,它将从输出列表中删除(case
表达式的后半部分)。在您的情况下,模式(a, b)
将始终匹配,这意味着后半部分是多余的 - 因此警告。
在理想情况下,如果用户输入的模式始终匹配,则列表推导实现将被修改为不生成case
表达式的后半部分。在此之前,忽略警告是安全的。