2017-05-05 9 views
0

文字列を取り、文字列内の任意の数字を7に置き換えたいと思います。たとえば、 "foo123"は "foo777"に置き換えられます。ハスケルのこの置き換え機能の間違いはどこですか?

これは私の機能です。

replace [] = [] 
replace (x:xs) = 
    if x == ['0'..'9'] 
    then '7' : replace xs 
    else x : replace xs 
+0

は、あなたはそれで何がありますか? –

+1

これはコンパイルすべきではありません。あなたはxをリストと比較しようとしていますので、Haskellはあなたがリストにマッチすると仮定します。 [可能な重複](http://stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without-using) – mfeineis

答えて

2

==は、xがリストと等しいかどうかをテストします。 elem関数を使用する必要があります。この関数は、パラメータとして1つの要素と要素のリストをとり、要素がリストにある場合はtrueを返します。だからあなたのコードは次のようになります。xは、リストの要素である場合

replace [] = [] 
replace (x:xs) = 
    if elem x ['0'..'9'] 
    then '7' : replace xs 
    else x : replace xs 
6

==はテストするものではありません。 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) 
関連する問題