我是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列表'。请帮忙。
答案 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 -> ...
。