2012-02-28 34 views
4

写一个清单追加功能我已经定义了一个自定义列表类型为f部分家庭作业练习。OCaml中

type 'a myType = 
    | Item of ('a * 'a myType) 
    | Empty;; 

我已经做了'长度',现在我需要'追加'功能。 我长功能:

let length l = 
    let rec _length n = function 
    | Empty   -> n 
    | Item(_, next) -> _length (n + 1) next 
    in _length 0 l;; 

但我真的不知道如何使附加功能。

let append list1 list2 = (* TODO *) 

我不能用列表模块,所以我不能使用任何::@

+1

这显然是一个家庭作业的问题。以下是我的提示:(a)您可以定义您的函数,以便第二个参数在结果中保持不变。所以你真的只需要担心第一个参数。 (b)如果你递归思考,你只需要知道如何附加到一个空列表,以及如何将一个非空列表分解成一个较小的附加问题(即列表较短的列表)。我希望这可以帮助,但不是太多!此致, – 2012-02-28 18:17:31

+0

我的问题是如何追加两个元素?我是否必须使用“:=”?谢谢!! – K1ng0e 2012-02-28 18:19:02

+0

您应该考虑创建* new *列表,而不是附加旧列表。但是,第二个列表可能在新列表中显示不变。如果你有一个“Item(3,Empty)”列表,并且你想在开始时加上'4',结果会是什么样子? – 2012-02-28 18:36:11

回答

8

我想我的意见越来越太长算作纯粹的意见。我真的不想回答,我只想提示。否则它会破坏目的。

重复我的提示:

a。第二个参数会出现在你的结果没有影响,所以你可以 花时间担心的第一个参数。

b。你首先需要知道如何将一些东西添加到空列表中。即,当第一个参数为空时,你需要 知道该怎么做。

c。你接下来需要知道如何将非空案例分解成更小的追加 的问题。

如果你不知道如何创建一个项目,那么你可能会写一个函数,(比如)一个整数和整数列表启动,并返回与前面的整数一个新的列表。这里是一个函数,它接受一个整数,并返回包含只是一个整数的列表:想到这

let list1 k = 
    Item (k, Empty) 

的一种方式是,每次Item出现在你的代码,你要创建一个新的项目。 Item被称为构造因为它构建了一个项目。

我希望这会有所帮助。

2

你的结构是一个列表,所以你应该通过定义的值nil是空表开始,和功能cons head tail,即追加head元素列表tail的前面。

另一个忠告:有时,它帮助了很多通过采取一个简单的例子,并试图做到这一点手动,即分解你想在你自己做简单的操作,怎样做才能启动。然后,你可以概括和编写代码...