我们其实可以从数据定义和一些常识/append必须遵守的一些规律推导出函数定义。
首先,我们有
data List a = Nil | Cons a (List a)
append :: List a -> List a -> List a
-- Nil Nil Nil
-- Cons x xs Cons y ys Cons z zs
这意味着我们可以枚举所有可能的 2 x 2 x 2 情况,
append Nil Nil = Nil
append Nil Nil = Cons z zs where z = .... ; zs = ....
append Nil (Cons y ys) = Nil
append Nil (Cons y ys) = Cons z zs where z = .... ; zs = ....
append (Cons x xs) Nil = Nil
append (Cons x xs) Nil = Cons z zs where z = .... ; zs = ....
append (Cons x xs) (Cons y ys) = Nil
append (Cons x xs) (Cons y ys) = Cons z zs where z = .... ; zs = ....
然后删除那些完全没有意义的方程式,并完成那些有意义的方程式。
追加法则很简单,不言而喻用一些伪代码写出来就足够了,
append [x1,x2,....,xn] [y1,y2,....,ym] =
[x1,x2,....,xn, y1,y2,....,ym]
这就像说什么新鲜事。