如何从Haskell中的列表中删除元素?

时间:2012-04-21 04:45:28

标签: haskell

我正在尝试编写的函数应该从给定的任何类型的列表中删除给定索引处的元素。

以下是我已经完成的事情:

           delAtIdx :: [x] -> Int -> [x]

           delAtIdx x y = let g = take y x
                          in let h = reverse x
                          in let b = take (((length x) - y) - 1) h
                          in let j = g ++ (reverse b)
                          in j

这是对的吗?有人可以提出另一种方法吗?

6 个答案:

答案 0 :(得分:9)

使用splitAt来定义它更简单,它在给定索引之前拆分列表。然后,您只需要从第二部分中移除第一个元素并将它们粘合在一起。

答案 1 :(得分:3)

reverse并且如果你可以在haskell中连接是连接的东西。它看起来对我有用,但我并不完全确定。

然而,要回答“真实”的问题:是的还有另一种(更简单的)方法。基本上,在使用haskell时,你应该像往常一样朝着相同的方向:递归。看看你是否可以制作这个函数的递归版本。

答案 2 :(得分:2)

超级简单(我认为):

removeIndex [] 0 = error "Cannot remove from empty array"
removeIndex xs n = fst notGlued ++ snd notGlued
    where notGlued = (take (n-1) xs, drop n xs)

我是一个完整的Haskell noob,所以如果这是错误的,请解释原因。

我通过阅读splitAt的定义来解决这个问题。根据Hoogle的说法,“它相当于(取n xs,下降n xs)”。这让我觉得,如果我们只是不加一个额外的数字,那么如果我们重新加入它就基本上会被移除。

以下是我引用的文章Hoogle link

以下是对它运行的测试:

*Main> removeIndex [0..10] 4
[0,1,2,4,5,6,7,8,9,10]

答案 3 :(得分:0)

deleteAt :: Int -> [a] -> [a]
deleteAt 0 (x:xs) = xs
deleteAt n (x:xs) | n >= 0 = x : (deleteAt (n-1) xs)
deleteAt _ _ = error "index out of range"

答案 4 :(得分:0)

这是我的解决方案:

removeAt xs n     | null xs   = []
removeAt (x:xs) n | n == 0    = removeAt xs (n-1)
                  | otherwise = x : removeAt xs (n-1)

答案 5 :(得分:0)

remove_temp num l i | elem num (take i l) == True = i
                    | otherwise  = remove_temp num l (i+1)

remove num l = (take (index-1) l) ++ (drop index l)
               where index = remove_temp num l 1

致电'删除'具有数字和列表作为参数的函数。并且您将获得一个没有该数字作为输出的列表。 在上面的代码中,remove_temp函数返回列表中存在该数字的索引。然后删除功能取出数字之前的列表和数字之后使用内置的' take'并且'掉落'前奏的功能。最后,完成了这两个列表的连接,它给出了一个没有输入数字的列表。