【问题标题】:A filter that contain a list in the beginning in OCaml在 OCaml 的开头包含列表的过滤器
【发布时间】:2013-12-16 21:11:58
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

    标签: list ocaml


    【解决方案1】:

    没有匹配列表前缀的模式。如果你把一个值想象成一棵树,那么一个模式总是匹配从某个点开始的完整子树。列表的前缀没有这种形式。当你挑选出完整的子树时,你会得到整个列表。

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

    【讨论】:

    • 谢谢。这就是我所做的。我反转列表,然后我做我的工作,然后我反转结果
    • 优秀。可能考虑使用反向列表作为您的代表?列表头部有低位数字是最自然的。 (不确定您是否已经这样做了。)
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2017-08-15
    • 2018-12-20
    相关资源
    最近更新 更多