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

如何从Haskell中的列表中删除元素?,haskell,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

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

以下是我已经做过的:

           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

这是正确的吗?有人能推荐另一种方法吗?

在haskell中,如果可以的话,可以避免反向和串联。这对我来说似乎是可行的,但我并不完全确定这一点


然而,要回答“真正”的问题:是的,还有另一种(更简单的)方法。基本上,在haskell中工作时,您应该朝着相同的方向看:递归。看看是否可以创建此函数的递归版本。

用将列表拆分到给定索引之前的方式来定义它要简单得多。然后,您只需要从第二部分中删除第一个元素并将它们粘在一起。

deleteAt::Int->[a]->[a]
删除0(x:xs)=xs
deleteAt n(x:xs)|n>=0=x:(deleteAt(n-1)xs)
deleteAt u0=错误“索引超出范围”
以下是我的解决方案:

removeAt xs n     | null xs   = []
removeAt (x:xs) n | n == 0    = removeAt xs (n-1)
                  | otherwise = x : removeAt xs (n-1)
使用数字和列表作为参数调用“remove”函数。您将得到一个没有该数字作为输出的列表。 在上面的代码中,remove_temp函数返回列表中数字所在的索引。然后使用前奏曲内置的“take”和“drop”功能,删除数字前和数字后的列表。最后,将这两个列表串联起来,得到一个没有输入编号的列表。

超级简单(我认为):

我是一个彻头彻尾的哈斯克尔·努伯,所以如果这是错误的,请解释原因

我通过阅读splitAt的定义来理解这一点。根据胡格尔的说法,“这相当于(取nxs,取nxs)”。这让我想到,如果我们不多拿一个号码,那么如果我们重新加入,它将基本上被删除

这是我引用的文章

下面是对其运行的测试:

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

我也已经这样做了:)但我认为这是内置的function@MIH1406:在特定位置删除列表中的元素在Haskell中不是很习惯用法,这就是为什么没有一个内置函数。考虑<代码>下拉<代码>而不是<代码>反转< /代码> ->代码> ->代码> Reals>代码>注意,如果你发现你在索引中删除一个元素(远离列表的前面)很多,你可能想重新考虑你选择的数据结构,或者你的算法。你能找到一种方法来保存每一步的一个比较吗?你能解释一下你在这里想做什么吗?请再解释一下。谢谢你发布了这个问题的答案!在堆栈溢出时不鼓励只使用代码的答案,因为原始海报(或未来读者)可能很难理解它们背后的逻辑。请编辑您的问题并对代码进行解释,以便其他人可以从您的答案中获益。谢谢你不能只做
(取(n-1)xs)++(drop n xs)
而不是定义一个元组来存储两个不同的值,然后把它们都取出来吗?我想你可以
removeIndex [] 0 = error "Cannot remove from empty array"
removeIndex xs n = fst notGlued ++ snd notGlued
    where notGlued = (take (n-1) xs, drop n xs)
*Main> removeIndex [0..10] 4
[0,1,2,4,5,6,7,8,9,10]