Haskell的地图功能

时间:2018-12-11 12:19:50

标签: haskell

问题:定义函数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]) 

1 个答案:

答案 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 ....

填写空白。实际上,它非常简单。