函数必须是这样的:insertElemAt :: a -> [Int] -> [a] -> [a]
.
例子:
insertElemAt 0 [2,5,9] [1..10]
= [1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 10]
insertElemAt 0 [1,2,4,8] [0,1,0,0,1,1,0,1]
= [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1]
我只知道初学者 Haskell(if
使用管道|
和递归),但我尽我所能来解决这个问题,但它从来没有奏效。这是我最近的尝试:
insertElemAt x [0] ys = ys
insertElemAt x [1,2] ys = x:x:ys
insertElemAt x [] ys = ys
insertElemAt x xs [] = []
insertElemAt x (n:ns) (y:ys) = y:insertElemAt x (n-1:ns) ys
我也尝试过这样的事情,但这似乎很混乱,我认为第一个更好:
insertElemAt :: a -> [Int] -> [a]-> [a]
insertElemAt x [0] ys = ys
insertElemAt x [1,2] ys = x:x:ys
insertElemAt x (n:ns) (y:ys) = y:insertElemAt x (map reduc (n:ns)) ys
reduc (n:ns) = n-1 : reduc ns
也许我的模式不好?我尝试以多种方式编写它们。
我还必须能够使用此函数并在名为 的函数中使用它,该函数insertElemsAt (:: [(a, Int)] -> [a] -> [a])
必须是上述函数的“通用”版本。所以我必须能够在哪个位置给出我想插入什么样的元素。
由于我不能做第一个,所以我更加迷失了这个。这是示例。我不知道如何使用管道if
-s 和递归来做到这一点:
insertElemsAt (zip [0,1,1] [2,5,9]) [1..10]
= [1, 0, 2, 3, 1, 4, 5, 6, 1, 7, 8, 9, 10]
insertElemsAt (zip [0,1,1,1] [1,2,4,8]) [0,1,0,0,1,1,0,1]
= [0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1]
有人可以向我解释如何以最简单的方式做到这一点吗?预先感谢您的任何帮助!