Haskell-如何迭代到列表并保留原始列表而不仅仅是尾部

Haskell-如何迭代到列表并保留原始列表而不仅仅是尾部,haskell,iteration,Haskell,Iteration,我对哈斯克尔很陌生。 下面是我的函数,它可以打印列表xs的所有元素,但仍然希望保留原始xs,而不是每个回合都有尾部。我不知道怎么做。有没有办法在迭代之前保存/复制xs?多谢各位 listElement :: [Int] -> [(Int, Int)] listElement [] = [] listElement (x:xs) = [(x, length xs)] ++ listElement xs 输出: listElement [1,2,3] [(1,2),(2,1),(3,0)]

我对哈斯克尔很陌生。 下面是我的函数,它可以打印列表xs的所有元素,但仍然希望保留原始xs,而不是每个回合都有尾部。我不知道怎么做。有没有办法在迭代之前保存/复制xs?多谢各位

listElement :: [Int] -> [(Int, Int)]
listElement [] = []
listElement (x:xs) = [(x, length xs)] ++ listElement xs
输出:

listElement [1,2,3]
[(1,2),(2,1),(3,0)]
listElement [1,2,3]
[(1,3),(2,3),(3,3)]
期望值:

listElement [1,2,3]
[(1,2),(2,1),(3,0)]
listElement [1,2,3]
[(1,3),(2,3),(3,3)]

在一般情况下,您可以创建一个临时函数(
t
),然后将原始列表和“当前尾部”作为参数传递:

t :: [Int] -> [Int] -> [(Int, Int)]
t [] _ = []
t (x:xs) original = [(x, length original)] ++ t xs original

listElement :: [Int] -> [(Int, Int)]
listElement xs = t xs xs

main = print $ listElement [1,2,3]

请注意,通常最好预先计算列表的长度,然后使用
映射将每个列表附加到每个元素

在这种特殊情况下,编译器似乎可以优化代码,并且只计算一次长度

listElement xs = map (\x -> (x, length xs)) xs

所以你想把原始的长度(xs)附加到每个元素上(制作一个元组)?我想知道如何保留原始的xs以备后续处理(长度只是一个例子)。