2012-03-26 79 views
0

我实现使用Ocaml程序编写本hoemwork功能列表的列表:压扁OCaml中

  • 不准使用List模块
  • 函数的类型是'a list list -> 'a list
  • 函数返回组成的列表列表以x连接在一起(只是列表的顶级级联是串联的,不像List.flatten)
  • 例如:[[1,2,3],[45]] => [1,2,3,4,5][[[1,2,3],[4,5]],[[6,7]]] => [[1,2,3],[4,5],[6,7]]

我不确定从哪里开始,谁能给我一些建议?谢谢

+0

只是一个评论:List.flatten只是平坦的顶级。它不会“变得更深”。实际上你可以从参数化中弄清楚这一点。它具有''列表列表 - >'列表',因此不能在深层列表结构中查看''a'类型。 – 2012-03-26 21:14:31

回答

6

我没有看到List.flatten和你的功能之间的区别。

要回答你的问题:像往常一样名单,去想想基本情况:

  • 当您连接东西的空列表你会怎么做?
  • 当你将某个非空列表(头部和尾部)与某些东西连接起来时,你会做什么?

裹一切都变成一个模式匹配,煮了几个小时,这样做了:-)

2

托马斯给了绝好的建议。您的基本操作将是将一个列表追加到另一个列表。首先将这个函数作为一个单独的函数写出可能会有所帮助。它会是这个样子:

let rec myappend a b = 
    match a with 
    | [] -> (* Empty list prefixed to b (easy case) *) 
    | ahead :: atail -> (* Recursive case *) 

武装用自己的附加功能,你可以进行递归 的另一个层面追加所有顶级名单托马斯建议。