如何进入列表并显示其元素和订单位置(HASKELL)?

时间:2018-09-27 21:43:22

标签: haskell

我有一个[1,2,3]之类的清单,我想按它旅行,按其位置显示其物品和顺序。

列表[1,2,3]的结果为:[(1,0),(2,1),(3,2)]

我有此代码:

increase:: Integer -> Integer

increase x = x + 1

firstApear:: [Integer] -> [(Integer, Integer)]

firstApear ls = firstApearAux 0 ls

firstApearAux:: Integer -> [Integer] -> [(Integer, Integer)]

firstApearAux _ [] = []

firstApearAux counter (ls:s) = [(ls, counter)] ++  firstApearAux (increase(counter) s)

我正尝试递归执行此操作,因为我不知道其他方法。

谢谢

1 个答案:

答案 0 :(得分:2)

此行有问题:

firstApearAux counter (ls:s) = [(ls, counter)] ++  firstApearAux (increase(counter) s)

您不应该在increase(counter) s前后加上方括号。看来编译器就像您要对increasecounter应用函数s一样。

实际上,如果您查看错误消息,它将告诉您以下信息:

  

main.hs:13:67: error: • Couldn't match expected type ‘[Integer] -> Integer’ with actual type ‘Integer’ • The function ‘increase’ is applied to two arguments, but its type ‘Integer -> Integer’ has only one In the first argument of ‘firstApearAux’, namely ‘(increase (counter) s)’ In the second argument of ‘(++)’, namely ‘firstApearAux (increase (counter) s)’M

这是已更正的版本。另外,我将对其进行一些清理,并摆脱无用的increase函数。 (旁注:increasesucc中已经以一种更为有用和通用的形式存在)

firstApearAux counter (ls:s) = (ls, counter) : firstApearAux (counter + 1) s

其余的代码也没问题。