我的家庭作业一直在推动我。我应该编写一个名为myRepl
的函数,它接受一对值和一个列表,并返回一个新列表,以便列表中每对第一个值的替换都替换为第二个值。
示例:
ghci> myRepl (2,8) [1,2,3,4]
> [1,8,3,4].
到目前为止,我有类似的东西(但它非常粗糙,根本不能正常工作。我需要有关算法的帮助:
myRep1 (x,y) (z:zs) =
if null zs then []
else (if x == z then y : myRep1 zs
else myRep1 zs )
我不知道如何创建一个带有一对值和一个列表的函数。我不确定它的正确语法是什么,我不确定如何进行算法。
任何帮助都将不胜感激。
答案 0 :(得分:2)
如下:
repl (x,y) xs = map (\i -> if i==x then y else i) xs
map
是一个函数,它接受一个函数,将它应用于列表中的每个值,并将该函数的所有返回值组合成一个新列表。
\i ->
表示法是编写完整函数定义的快捷方式:
-- Look at value i - if it's the same as x, replace it with y, else do nothing
replacerFunc x y i = if x == y then y else i
然后我们可以重写repl
函数:
repl (x, y) xs = map (replacerFunc x y) xs
我担心你必须知道的map
功能 - 相对容易看出它是如何工作的。查看文档:
http://www.haskell.org/hoogle/?hoogle=map
答案 1 :(得分:1)
如何在没有map
的情况下写这个?现在,一个好的经验法则是首先将递归的基本情况放在首位:
myRep1 _ [] = ???
现在,如果list元素是您要替换的元素,则需要一个特殊情况。我会为此推荐一名警卫,因为它比if
读得更好:
myRep1 (x,y) (z:zs)
| x == z = ???
| otherwise = ???
由于这是家庭作业,我留下了一些空白让你填写: - )
答案 2 :(得分:0)
myRepl :: Eq a => (a, a) -> [a] -> [a]
myRepl _ [] = []
myRepl (v, r) (x : xs) | x == v = r : myRepl (v, r) xs
| otherwise = x : myRepl (v, r) xs
根据map
:
replaceOccs :: Eq a => a -> a -> [a] -> [a]
replaceOccs v r = map (\ x -> if x == v then r else x)