尝试为 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]]
,例如 x
是 1
,xs
是 [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 _ _ [] = []
如标题所示,我正在尝试创建一个 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]]
,例如 x
是 1
,xs
是 [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 _ _ [] = []