ocaml中的嵌套列表

时间:2013-06-02 12:40:50

标签: ocaml nested-lists

我是Ocaml的新手,并按如下方式定义了嵌套列表:

    type 'a node = Empty | One of 'a | Many of 'a node list

现在我想定义一个包装函数,它围绕嵌套列表的第一个顺序成员包装方括号。对于前者包装(许多[一个;许多[c; d];一个b;一个e;])返回许多[许多[一个;空]。许多[许多[C; d]空]。许多[B;空]。许多[E;空]。 这是我的相同代码:

    let rec wrap list = function
         Empty -> []
        | Many[x; y] -> Many [ Many[x; Empty]; wrap y;];;

但是我在最后一个表达式中收到一个错误:这个表达式的类型是'一个节点,但是表达式是'b列表'。请帮忙。

1 个答案:

答案 0 :(得分:2)

您的两场比赛不会返回相同类型的值。第一个语句返回b'列表;第二个语句返回一个'节点。要通过类型检查器,您需要将第一个语句更改为:Empty -> Empty

第二个问题(您将在下一个问题中讨论)是您的递归调用没有被输入正确类型的值。 wrap : 'a node -> 'a node,但y : 'a node list。解决此问题的一种方法是将表达式替换为wrap (Many y)

还有一个问题是,您的当前函数假定Many列表只有两个元素。我想你想要做的是Many (x::y)。这匹配x作为列表的头部,y匹配尾部。但是,您需要一个案例来处理Many ([]),以避免无限递归。

最后,你的功能的整体形式让我觉得有点不寻常。我会将function Empty -> ...替换为match list with | Empty -> ...