尝试为 Haskell 创建插入列表中的特定点

Attempting to create an Insert for Haskell that inserts at a certain point in a list

如标题所示,我正在尝试创建一个 Haskell 函数,它可以在列表中的某个点插入,如果我尝试插入的点大于列表的大小, 没有插入完成。这是我第一次使用 Haskell,我才刚刚开始学习这门语言,所以很可能我遗漏了一些简单的东西。

现在,作为我的意思的一个例子,下面是输入及其预期输出的示例

\> insert 3 100 [1,2,3,4,5,6,7,8] 
[1,2,3,100,4,5,6,7,8] 

\> insert 8 100 [1,2,3,4,5,6,7,8]  
[1,2,3,4,5,6,7,8,100] 

\> insert 9 100 [1,2,3,4,5,6,7,8] 
[1,2,3,4,5,6,7,8] 

\> insert 3 100 [] 
[] 

这是我迄今为止尝试过的代码

insert 0 y [] = [y]
insert n y [] = []
insert 0 y [x:xs] = y:x:[xs]
insert n y [x:xs] = y:(insert (n-1) y [x:xs])

此代码在 insert 0 y [x:xs] = y:x:[xs] at the second xs

中产生以下错误

Image

图像转录:

xs :: [a_aEmT]
Defined at C:\Users\darin\OneDrive\Desktop\Haskell\Lab1_Submit.hs:16:15
_ :: a_aEmT[sk:1]
• Couldn't match expected type ‘a’ with actual type ‘[    
  ‘a’ is a rigid type variable bound by the inferred type of insert :: t -> a -> [[a]] -> [a] at C:\Users\darin\OneDrive\Desktop\Haskell\Lab1_Submit.hs:(14,1)-(17,45)
• In the expression: xs
  In the second argument of ‘(:)’, namely ‘[xs]’
  In the second argument of ‘(:)’, namely ‘x : [xs]’
• Relevant bindings include
xs :: [a]

我提前感谢你能提供的任何帮助。我认为这是一个相当微不足道的问题,我只是缺乏解决它的理解。

[x:xs] 是一个 单例 列表的模式,它有一个 non-empty 列表 (x:xs).因此,这将匹配 [[1,4,2]],例如 x1xs[4,2]。但不是 non-empty 列表本身:即 (x:xs)。此外,这还意味着如果您 x 是列表列表的元素,因此如果您想使用 y : x : [xs].

则类型错误

还有一些其他的错误:它是y : x : xs而不是y : x : [xs]因为xs已经是一个列表[a] 的项目,在递归的情况下,你会产生 x,而不是 y,所以:

insert :: Int -> a -> [a]
insert 0 y [] = [y]
insert n y [] = []
insert 0 y (x:xs) = y : x : <strong>xs</strong>
insert n y (x:xs) = <strong>x</strong> : (insert (n-1) y <b>xs</b>)

您可以将其简化为:

insert :: Int -> a -> [a]
insert 0 y xs = y : xs
insert n y (x:xs) = x : insert (n-1) y xs
insert _ _ [] = []