我想创建一个以二进制形式返回下一个数字的函数 . 例如 :
000 - > 001 - > 010 - > 011 - > 100 - > 101 - > 110 - > 111.我的功能是:
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对,然后是空列表 .
谢谢你的帮助 .
1 回答
没有匹配列表前缀的模式 . 如果您将值想象为树,则模式始终匹配从某个点开始的完整子树 . 列表的前缀没有此表单 . 当您选择完整的子树时,您将获得整个列表 .
如果您的算法需要从列表的后面向前工作,您可能希望在开始之前反转列表 .