问题:定义函数setElements,该函数采用成对的(n,x)对的列表indxs(其中n是一个 Int)和一个列表xs,并针对每对(n,x)将xs中的第n个元素设置为x。 如果一对在其第一部分中包含负索引,或者索引大于 xs的长度,请忽略此对。 如果indxs列表包含多个具有相同密钥的对(例如[[1,'a'),(1,'b')]),则 密钥的最后一次出现将是该密钥。 例子:
setElements [(1, 'a'), (-4, 't'), (3, 'b')] "#####" = "#a#b#"
setElements [(2, 50), (50, 2)] [8, 7, 6, 5, 4] = [8, 7, 50, 5, 4]
setElements [(3, 'a'),(5, 'b'),(3, 'c')] "wwwwwww" = "wwwcwbw"
我的代码:
--1.a
setElement:: Int -> a -> [a] -> [a]
setElement n x xs = (take n xs ++ x:tail(drop n xs))
--b
setElements :: [(Int,b)] -> [b] -> [b]
setElements (x:xs) = map (setElement (fst x) (snd x) [b])
答案 0 :(得分:2)
setElement函数几乎是正确的,但是标准的实现方法是
。 take n xs ++ [x] ++ drop (n + 1) xs
但是同样,这不能解决负n的问题。使用模式数学可以很容易地做到这一点。
setElement n x xs | n < 0 = xs
| otherwise = take n xs ++ [x] ++ drop (n + 1) xs
对于setElements,您将必须进行递归思考。当第一个参数为空时,该函数应仅返回第二个参数。
setElements [] ys = ys
当第一个列表不为空
上述结果应递归发送到第一个参数的其余部分
setElements ((x,b):xs) ys = let ps = ...
in setElements ....
填写空白。实际上,它非常简单。