我想创建一个以二进制形式返回下一个数字的函数。例如:
000 - > 001 - > 010 - > 011 - > 100 - > 101 - > 110 - >我的职责是:
let rec next_number = function
| [] -> []
| (a,b)::[] -> if b = 0 then (a,1)::[] else (a,0)::[]
| l::(a,value1)::(b,value2)::[] -> if (value2 = 0) then l::(a,value1)::(b,1)::[]
else
begin
if value1 = 0 then l::(a,1)::(b,0)::[]
else (next_number l)::(a,0)::(b,0)::[]
end
;;
当我编译时,我得到了错误:这个表达式(l in l::( a,value1)::(b,value2):: [])具有类型'a * int但是表达式是期望的类型( 'a * int)列表
如何告诉OCaml过滤器是一个列表,然后是一对夫妇,然后是一个空列表,而不是3对,然后是空列表。
感谢您的帮助。
答案 0 :(得分:1)
没有匹配列表前缀的模式。如果您将值想象为树,则模式始终匹配从某个点开始的完整子树。列表的前缀没有此表单。当您选出完整的子树时,您将获得整个列表。
如果您的算法需要从列表的后面向前工作,您可能希望在开始之前反转列表。