我想在Isabelle / HOL中定义一个将列表加倍的函数
fun double :: "'a list => 'a list" where
...
这样double [x1, x2, ...] = [x1, x1, x2, x2, ...]
我尝试了以下内容:
fun double :: " 'a list ⇒ 'a list" where
"double [] = []" |
"double [x#[l]] = x # x # double [l]"
以及其他一些定义。我收到了错误
类型统一失败
应用程序中的类型错误:不兼容的操作数类型
我的功能出了什么问题?
答案 0 :(得分:3)
实际上错误消息包含一些进一步的信息。即
Operator: double :: 'a list ⇒ 'a list
Operand: [[x, l]] :: ??'a list list
告诉我们[[x, l]]
属于?'a list list
类型,即列表列表。如果你想把它作为double
的参数给出,它需要一个'a list
类型的参数,你会得到类型错误。
错误消息中术语[[x, l]]
的来源是定义的第二行
`double [x # [l]]`
其中x#[l]
打印为等效的[x, l]
。
输入中有几个多余的括号。请注意,与Isabelle中的非正式数学文本(非正式含义在纸上;))相比,您不能使用括号[
,]
显式嵌套。请尝试以下方法。
fun double :: " 'a list ⇒ 'a list"
where
"double [] = []" |
"double (x#xs) = x # x # double xs"