0

基本的に2つの引数を取るこの関数に取り組んでいます。1 つ目は数値で、2 つ目はリストです。リストに表示されるたびに、最初の引数を 3 に置き換えたいと思います。私の機能は正常に動作します。ここにあります:

censorword _ [] = [] 
censorword b (x:xs) 
        |  b == x = 3:censorword b xs 
        | otherwise = x:censorword b xs

私の質問は、文字列に対してどのように機能させるかです。つまり、次のようなことをしたいと思います: censorword "ab" ["cdZ",ab"] = ["cdZ","hello"] . ここでは、"ab" を hello に置き換えました。

どんなアイデアでも大歓迎です。

4

2 に答える 2

2

置き換える値を変更するだけ3で済みます(元のコードで)。

censorword :: String -> [String] -> [String]
censorword _ [] = []  
censorword b (x:xs)
        |  b == x = "hello" : censorword b xs
        | otherwise = x : censorword b xs

この関数は、次のように一般化および簡略化できますmap

censorword' :: (Eq a) => a -> a -> [a] -> [a]
censorword' a b = map (\x -> if x == a then b else x)

censorword' "ab" "he" ["ab", "he", "ab"] -- => ["he", "he", "he"]
于 2012-12-15T18:36:03.663 に答える
1

一般化。

censor :: Eq a => a -> a -> [a] -> [a]
censor _           _      []       = []
censor replacement needle (x : xs)
    | needle == x                  = replacement : censor replacement needle xs
    | otherwise                    = x           : censor replacement needle xs

それで

censorword = censor 3
censorwordForStrings = censor "hello"

censor簡略化できます:

censor :: Eq a => a -> a -> [a] -> [a]
censor replacement needle = map censor' where
    censor' x | needle == x = replacement
              | otherwise   = x
于 2012-12-15T18:41:15.707 に答える