我有一个函数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)
我只是个初学者.
所以你的问题是如何实施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)
相反 - 请注意,您不需要添加的第一个案例 - 它包括在内;)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |