为元组添加索引

dij*_*jam 1 haskell

我有一个函数addIndex [1,2,3] = [(0,1),(1,2),(2,3)]应该为每一对添加一个索引我在实现它时遇到了麻烦.这就是我所做的;

addIndexs :: [Int] -> [(Int,Int)]
addIndexs [] = []
addIndexs x = zip x [1..length x]
Run Code Online (Sandbox Code Playgroud)

我能够使用zip put实现它我感觉它的作弊,我希望能够在不使用任何预构建函数的情况下实现它.

我没有使用预构建功能的最接近的是

addindex x = [(i,z) | z <- x, i <-[1..length x]]
Run Code Online (Sandbox Code Playgroud)

但是这会为每个元组添加所有索引

addIndex [1,2,3] = [(0,1),(1,1),(2,1),(0,2),(1,2),(2,2)...]
Run Code Online (Sandbox Code Playgroud)

我只是个初学者.

Car*_*ten 5

所以你的问题是如何实施zip

根据您想要处理不同长度列表的方式(Haskell只是忽略了一个更长并且停留在更短的长度),这就是找到正确的模式匹配:

myZip _  []         = []
myZip [] _          = []
myZip (x:xs) (x:ys) = (x,y) : myZip xs ys
Run Code Online (Sandbox Code Playgroud)

(如果你愿意,试着实现这个)

现在你可以很容易地把它做到你想做的事情(通过使用[1..]其中一个列表 - 你不需要length它在这里工作的方式和前奏)


顺便说一句:如果你设法让列表理解工作(至少没有拉链本身在某种形式),我会感到惊讶


备注

虽然这是学习模式匹配和递归的一个很好的练习,但你不会在现实生活中的代码中真正做到这一点

你会使用你刚开始使用的东西

addIndexs xs = zip [1..] xs
Run Code Online (Sandbox Code Playgroud)

相反 - 请注意,您不需要添加的第一个案例 - 它包括在内;)