我有这个代码:
filtro :: [(String, Int, Int)] -> [(String, Int, Int)]
filtro [] = []
filtro (x:xs)
| pior x xs = filtro xs
| otherwise = x : filtro xs
我需要使这个变量为静态的:pior xxsfiltro xs。知道怎么做吗?
听起来您想要将pior
应用于x
和整个列表,而不仅仅是尾部。我认为某种程度的关注分离可以帮你一些忙。首先,您的函数只是filter
,它可以定义为
filter :: (a -> Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
| p x = x : filter x xs
| otherwise = filter x xs
所以我们可以利用这一优势。然后
filtro :: [(String, Int, Int)] -> [(String, Int, Int)]
filtro xs = filter (x -> not (pior x xs)) xs
由于当xs
是整个列表时,我们围绕它进行闭包,因此它将始终保持该闭包中的整个列表(记住,在Haskell中,变量永远不会改变(。
如果你真的想把它作为一个递归函数来做,你需要一个额外的参数,它在计算期间保持整个列表。
filtro' :: [(String, Int, Int)] -> [(String, Int, Int)] -> [(String, Int, Int)]
filtro' _ [] = []
filtro' xss (x:xs)
| pior x xss = filtro xss xs
| otherwise = x : filtro xss xs
filtro :: [(String, Int, Int)] -> [(String, Int, Int)]
filtro xs = filtro' xs xs
在任何一种情况下,您都需要将整个列表存储在某个地方,无论它是在一个额外的参数中,还是(首选(透明地存储在一个闭包中。