功能替代

时间:2012-11-04 14:52:55

标签: haskell

如何在列表中用参数b(1)替换参数a(0)来执行一个函数(recursivily)? 例如:

    substitute 0 1 [1,0,3,0,4,0,0]
    [1,1,3,1,4,1,1]

感谢。

2 个答案:

答案 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中,递归模式由高阶函数捕获,如mapfilter等。