一个过滤器,在OCaml的开头包含一个列表

时间:2013-11-30 23:01:34

标签: list ocaml

我想创建一个以二进制形式返回下一个数字的函数。例如:

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对,然后是空列表。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

没有匹配列表前缀的模式。如果您将值想象为树,则模式始终匹配从某个点开始的完整子树。列表的前缀没有此表单。当您选出完整的子树时,您将获得整个列表。

如果您的算法需要从列表的后面向前工作,您可能希望在开始之前反转列表。