文字列を取り、文字列内の任意の数字を7に置き換えたいと思います。たとえば、 "foo123"は "foo777"に置き換えられます。ハスケルのこの置き換え機能の間違いはどこですか?
これは私の機能です。
replace [] = []
replace (x:xs) =
if x == ['0'..'9']
then '7' : replace xs
else x : replace xs
文字列を取り、文字列内の任意の数字を7に置き換えたいと思います。たとえば、 "foo123"は "foo777"に置き換えられます。ハスケルのこの置き換え機能の間違いはどこですか?
これは私の機能です。
replace [] = []
replace (x:xs) =
if x == ['0'..'9']
then '7' : replace xs
else x : replace xs
==
は、xがリストと等しいかどうかをテストします。 elem
関数を使用する必要があります。この関数は、パラメータとして1つの要素と要素のリストをとり、要素がリストにある場合はtrue
を返します。だからあなたのコードは次のようになります。x
は、リストの要素である場合
replace [] = []
replace (x:xs) =
if elem x ['0'..'9']
then '7' : replace xs
else x : replace xs
==
はテストするものではありません。 x
がと等しいかどうかを確認します。リストはです。代わりにelem
関数を使用してください。
replace [] = []
replace (x:xs) =
if x `elem` ['0'..'9']
then '7' : replace xs
else x : replace xs
if
あなたはxs
に再帰呼び出しを繰り返す必要はありませんので、別の表現を使用することができ、どこでも使用することができ、純粋な式です:
replace [] = []
replace (x:xs) = (if x `elem` ['0'..'9'] then '7' else x) : replace xs
最後に、あなただけ使用することができます明示的な再帰を使用する代わりにmap
replace xs = map (\x -> if x `elem` ['0'..'9'] then '7' else x) xs
か、単に
replace = map (\x -> if x `elem` ['0'..'9'] then '7' else x)
代わりData.Char.isDigit
を使用することもできます。
import Data.Char
replace = map (\x -> if isDigit x then '7' else x)
は、あなたはそれで何がありますか? –
これはコンパイルすべきではありません。あなたはxをリストと比較しようとしていますので、Haskellはあなたがリストにマッチすると仮定します。 [可能な重複](http://stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without-using) – mfeineis