在每个位置创建包含新元素的列表列表

joh*_*ohn 4 haskell list insert

我是haskell世界的新手,我想知道如何在haskell中的列表的每个位置插入一个值,并返回包含每个位置值的子列表.例如:

insert' :: a -> [a] -> [[a]]
insert' a [] = [[a]]
insert' a list = ??
Run Code Online (Sandbox Code Playgroud)

得到类似的东西:

insert' 7 [1,2,3] = [[7,1,2,3],[1,7,2,3],[1,2,7,3],[1,2,3,7]]
Run Code Online (Sandbox Code Playgroud)

del*_*lta 8

insert' :: a -> [a] -> [[a]]
insert' y [] = [[y]]
insert' y xss@(x:xs) = (y : xss) : map (x :) (insert' y xs)
Run Code Online (Sandbox Code Playgroud)

虽然空列表案例很自然,但我们来看看insert' y xss@(x:xs).我们基本上有两个需要涵盖的案例:

  1. y出现在前面x.然后我们可以使用y : xss.
  2. y出现在某个地方之后x.因此,我们只需将其插入列表的其余部分,并确保它x是第一个元素map (x:).