如何在列表中用参数b(1)替换参数a(0)来执行一个函数(recursivily)? 例如:
substitute 0 1 [1,0,3,0,4,0,0]
[1,1,3,1,4,1,1]
感谢。
答案 0 :(得分:6)
不需要递归!
substitute :: Eq a => a -> a -> [a] -> [a]
substitute old new = map subs where
subs x | x == old = new
| otherwise = x
如果这是家庭作业,您可以轻松替换definition of map
( 递归)。
答案 1 :(得分:5)
最简单的是使用列表理解:
subst a b xs = [c | x<-xs, let c=if x==a then b else x]
。
但这不是递归。对于递归,它只是列表结构(即结构递归)的案例分析:
subst a b [] = []
subst a b (x:xs)
| x==a = b:subst a b xs
| otherwise = x:subst a b xs
是foldr
(或map
)模式的一个实例:
subst a b = foldr (\x xs-> (if x==a then b else x) : xs) []
subst a b = map (\x -> if x==a then b else x )
通常建议在递归定义中使用“worker”函数,如下所示:
subst a b xs = go xs
where
go [] = []
go (x:xs)
| x==a = b:go xs
| otherwise = x:go xs
但如果你盯着它片刻,你会发现它遵循map
模式。在Haskell中,递归模式由高阶函数捕获,如map
,filter
等。