我是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