最初の要素が文字列内の文字 (findAndReplace の 2 番目の引数) であり、2 番目の要素が変更したい文字 (文字のみ) の 2 つの要素リストのリストを入力したいと考えています。同様のことを行う Haskell の関数は既にありますか? これは大いに役立つからです!
1 に答える
固定長を指定しているため、最初の入力にリストのリストではなくタプルのリストを使用したい場合があります。タプルは混合型を持つことができる固定長のコレクションですが、リストは単一の型の任意の長さのコレクションです。
myTuple = ('a', 'b') :: (Char, Char)
myTriple = ('a', 'b', 'c') :: (Char, Char, Char)
myList = ['a'..'z'] :: [Char]
タプルの各フィールドの型をどのように指定する必要があるかに注目してください。また、(Char, Char)
はと同じタイプではない(Char, Char, Char)
ため、互換性がありません。
したがって、タプルを使用すると、型シグネチャを次のように持つことができますreplace
。
replace :: [(Char, Char)] -> String -> String
そして、これは、検索して置換する文字のペアのリストでなければならないことを型シグネチャで指定します。誰かが検索する文字だけを与え、置換する文字を与えなかった場合のように、悪い入力に対処する必要はありません。それと。
現在、一般的に連想リストと呼ばれるものを渡しています。Haskell には、それらを処理するための関数が組み込まれていData.List
ますData.Map
。ただし、この演習では必要ないと思います。
今は、ペアのリストを使ってこの問題を解こうとしていますが、ペアを 1 つだけ使って解いた方が簡単です。
replace1 :: (Char, Char) -> String -> String
replace1 (findChr, replaceChr) text = ?
ここで、 の各文字をチェックtext
し、 に等しい場合findChr
は に置き換えreplaceChr
、そうでない場合はそのままにします。
replace1 (findChr, replaceChr) text = map (\c -> ...) text
詳細はお任せします (ヒント: if-then-else)。
replace
次に、これを使用して、より単純な関数を使用して関数を構築できますreplace1
。これで作業を開始できます。1 日か 2 日経ってもまだわからない場合は、以下にコメントしてください。別のヒントを提供します。