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
函数,在列表中的所有值n
和m
之间插入值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
答案 0 :(得分:1)
由于您只会在列表的前面添加值,因此不需要insert
功能。 (:)
就足够了。与insert
非常相似,我们递归遍历列表。由于我们想要检查两个值是否一次匹配,并且还会根据我们是否找到匹配而在不同列表上递归调用该函数,因此最好将模式匹配(x1:x2:xs)
而不仅仅{{1} }}
如果(x:xs)
匹配m
且x1
匹配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)