如何在Haskell中删除列表中的第n个元素

如何在Haskell中删除列表中的第n个元素,haskell,Haskell,如何编写函数的实现,该函数接受一个数字n和一个列表,并从列表中删除位置n处的元素。例如:删除0[1,2,3,4]=[2,3,4] 以下是我的尝试: import Data.List.Split 移除::Int->[a]->[a] remove xs=let remove nxs=let(as,bs)=在as++尾部bs中拆分nxs 但它不工作,并向我显示“变量不在范围内”。 有人知道怎么修吗? 谢谢 我写了一个非常直观的递归方法: remove :: Int -> [a] -> [

如何编写函数的实现,该函数接受一个数字n和一个列表,并从列表中删除位置n处的元素。例如:
删除0[1,2,3,4]=[2,3,4]

以下是我的尝试:

import Data.List.Split
移除::Int->[a]->[a]
remove xs=let remove nxs=let(as,bs)=在as++尾部bs中拆分nxs
但它不工作,并向我显示
“变量不在范围内”
。 有人知道怎么修吗?
谢谢

我写了一个非常直观的递归方法:

remove :: Int -> [a] -> [a]
remove _ [] = []
remove 0 (x:xs) = xs
remove n (x:xs) = x : remove (n-1) (xs)
考虑到我考虑的第一个元素是索引0。
如果您有任何疑问,请告诉我。

问题是您的函数前面有
remove xs=Let remove n xs=
,后面是实际的主体:
Let(as,bs)=在as++tail bs中拆分n xs

您需要删除第一个
remove xs=let
部分,最终得到:

remove::Int->[a]->[a]
在as++尾部bs中删除nxs=let(as,bs)=拆分nxs
或者作为一行程序的一部分,这可能会帮助您更清楚地看到语法:

remove::Int->[a]->[a]
删除nxs=let(as,bs)=拆分nxs
在as++中
尝试将这两个选项作为纯(合成)语法阅读:

原件:

functionName :: Type1 -> Type2 -> Type2
functionName arg1 = LET ident1 ident2 arg1 = LET letAssignment IN letBody
固定的:

functionName :: Type1 -> Type2 -> Type2
functionName arg1 arg2 = LET letAssignment IN letBody

但这里有一个提示:你可以使用<代码>取然后<代码> LUP 在列表中间删除1个元素。或者使用
zip[0..]list
将索引添加到列表中,然后
筛选出要删除的索引。
remove 8[1,2,3]
应该是什么?对我的提示稍加更正(因为我现在无法编辑我的评论):对于我的第一个建议,使用
splitAt
两次可能比使用
take
然后
drop
更容易。请不要将您的尝试放在评论部分。把它放在问题部分,格式化。你有
remove xs=let remove n xs=let(as,bs)=splitAt n xs in as++tail bs
,但它应该是
remove n xs=let(as,bs)=splitAt n xs in as++tail bs
。请不要在你的答案中使用.png文件。@MichaelLitchard很抱歉,不知道,我会马上更新它。