Haskell函数采用一对值和一个列表

时间:2013-02-12 03:08:58

标签: list function haskell

我的家庭作业一直在推动我。我应该编写一个名为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 )

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

任何帮助都将不胜感激。

3 个答案:

答案 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)