首页 文章

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

提问于
浏览
0

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

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 回答

  • 1

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

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

相关问题