2

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

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

现在我想定义一个包装函数,将方括号包裹在嵌套列表的一阶成员周围。例如。wrap(Many [ one a; Many[ c; d]; one b; one e;] ) 返回 Many [Many[one a; 空的]; 许多[许多[c;d]; 空的]; 许多[b; 空的]; 许多[e; 空的]]。这是我的代码:

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

但是我在最后一个表达式中遇到错误:此表达式的类型为 'a 节点,但预期的表达式为 'b 列表类型。请帮忙。

4

1 回答 1

2

您的两个匹配项没有返回相同类型的值。第一条语句返回一个 b' 列表;第二条语句返回一个 'a 节点。要通过类型检查器,您需要将第一条语句更改为: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 -> ....

于 2013-06-02T13:19:33.473 回答