0

我的家庭作业一直把我逼上绝路。我应该编写一个名为的函数,该函数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 )

我不知道如何创建一个接受一对值和一个列表的函数。我不确定正确的语法是什么,我不确定如何进行算法。

任何帮助,将不胜感激。

4

3 回答 3

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

于 2013-02-12T04:04:41.990 回答
1

没有这个怎么写map?现在,一个好的经验法则是首先排除递归的基本情况:

myRep1 _ [] = ??? 

现在,如果列表元素是您要替换的元素,您需要一种特殊情况。我会为此推荐一个警卫,因为它读起来比if

myRep1 (x,y) (z:zs) 
    | x == z = ???
    | otherwise = ???

由于这是家庭作业,我留了一些空白供您填写:-)

于 2013-02-12T13:01:49.927 回答
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)
于 2017-02-13T18:20:32.847 回答