17

「HELLO WORLD」という文字列があるとすると、文字列内の文字「O」を文字「X」に置き換える関数を呼び出して、新しい文字列が「HELLX WXRLD」のようになる方法はありますか?

4

6 に答える 6

40

どうですか:

let 
    repl 'o' = 'x'
    repl  c   = c
in  map repl "Hello World"

後で追加の文字を置き換える必要がある場合は、repl関数に句を追加するだけです。

于 2013-10-23T15:21:53.807 に答える
14

この古いスレッドを取り上げて申し訳ありませんが、ラムダ式を使用しないのはなぜですか?

λ> let replaceO = map (\c -> if c=='O' then 'X'; else c)
λ> replaceO "HELLO WORLD"
"HELLX WXRLD"`
于 2014-07-03T11:14:03.333 に答える
14

代替案 1 - MissingH の使用

初め:

import Data.List.Utils (replace)

次に使用します。

replace "O" "X" "HELLO WORLD"

代替案 2 - Control.Monad を使用する

1 つの面白い野郎:

import Control.Monad (mfilter)

replace a b = map $ maybe b id . mfilter (/= a) . Just

例:

λ> replace 'O' 'X' "HELLO WORLD"
"HELLX WXRLD"

代替案 3 - if の使用

Amon の提案は、おそらく私が信じる最高のものでした! インポートがなく、読みやすく、理解しやすい!

しかし、うるさいです - セミコロンは必要ありません:

replace :: Eq a => a -> a -> [a] -> [a]
replace a b = map $ \c -> if c == a then b else c
于 2016-09-12T15:10:37.387 に答える
1

分割統治法を使用した別の解決策を次に示します。

replaceO [] = []
replaceO (x:xs) = 
     if x == 'O' 
     then 'X' : replaceO xs 
     else x : replaceO xs

まず、エッジ条件を設定します"replaceO [] = []"
リストが空の場合、置き換えるものはなく、空のリストを返します。

次に、紐を頭と尻尾に分けます。この場合'H':"ELLOWORLD"
、頭が「O」に等しい場合、「X」に置き換えられます。文字列の残りの部分に replaceO 関数を適用します。
head が 'O' と等しくない場合、head を元の位置に戻し、残りの文字列に replaceO 関数を適用します。

于 2013-10-24T02:39:58.077 に答える
1

If you depend on the text package (like 99.99% of Haskell applications), you can use T.replace:

>>> replace "ofo" "bar" "ofofo"
"barfo"
于 2021-03-23T10:01:31.013 に答える
-2

これは使えると思います。

main = print $ charRemap "Hello WOrld" ['O','o'] ['X','x']

charRemap :: [Char] -> [Char] -> [Char] -> [Char]
charRemap [] _ _ = []
charRemap (w:word) mapFrom mapTo =
    if snd state
        then mapTo !! fst state : charRemap word mapFrom mapTo
        else w : charRemap word mapFrom mapTo
    where
        state = hasChar w mapFrom 0

hasChar :: Char -> [Char] -> Int -> (Int,Bool)
hasChar _ [] _ = (0,False)
hasChar c (x:xs) i | c == x = (i,True)
                   | otherwise = hasChar c xs (i+1)
于 2014-07-03T12:17:27.227 に答える