Haskell中的Interspace程序

时间:2016-11-05 19:15:10

标签: algorithm haskell

insert :: Eq(a) => a -> a -> [a] -> [a]
insert m n [] = []
insert m n (x:xs) | m==x = n : x : insert m n xs  
                 | otherwise = x : insert m n xs

上面的insert函数是一个工作函数,它在值n的所有实例之前将值m插入到列表中。

我需要帮助编写interspace函数,在列表中的所有值nm之间插入值q。这就是我到目前为止所做的:

 interspace :: Eq(a) => a -> a -> a->[a] -> [a]

 interspace m n q[] = []

 interspace m n q (x:xs)| m==x && q==(head xs)  = n: x : insert m n (headxs)++interspace m n q (xs)

                         | otherwise = x : interspace m n q xs

1 个答案:

答案 0 :(得分:1)

由于您只会在列表的前面添加值,因此不需要insert功能。 (:)就足够了。与insert非常相似,我们递归遍历列表。由于我们想要检查两个值是否一次匹配,并且还会根据我们是否找到匹配而在不同列表上递归调用该函数,因此最好将模式匹配(x1:x2:xs)而不仅仅{{1} }}

如果(x:xs)匹配mx1匹配q,我们会将其置于列表的头部并以其他方式递归调用x2名单。如果他们不是马赫,我们会在interspace上致电interspace

(x2:xs)

使用示例:

 interspace :: Eq a => a -> a -> a-> [a] -> [a]
 interspace m n q []         = []
 interspace m n q [x]        = [x]
 interspace m n q (x1:x2:xs) | m == x1 && q == x2 = m : n : q : interspace m n q xs
                             | otherwise          = x1 : interspace m n q (x2:xs)