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



我是Haskell的新手。下面是我的函数,用于打印列表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)]

在一般情况下,您可以创建一个临时函数(在这种情况下为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]

在线试用!

请注意,通常最好预先计算列表的长度,然后用map将它们中的每一个附加到每个元素中。

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

listElement xs = map (x -> (x, length xs)) xs
listElement xs = map (x -> (x, len)) xs where len = length xs

最新更新