0

私の宿題は私を壁に押し上げてきました。myRepl値のペアとリストを受け取り、リスト内のペアの最初の値が出現するたびに2番目の値に置き換えられるように、新しいリストを返すという関数を作成することになっています。

例:

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 _ [] = ??? 

ここで、list要素が置き換えたいものである場合は、特別なケースが必要です。私はこれのための警備員をお勧めします、それはよりよく読むので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 に答える