在Haskell中的递归过程中生成一个静态变量



我有这个代码:

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

在任何一种情况下,您都需要将整个列表存储在某个地方,无论它是在一个额外的参数中,还是(首选(透明地存储在一个闭包中。

最新更新