我想写一个函数,它接受一个字符串并用7替换字符串中的任何数字。例如“foo123”将被替换为“foo777”
这是我的功能。
replace [] = []
replace (x:xs) =
if x == ['0'..'9']
then '7' : replace xs
else x : replace xs
答案 0 :(得分:6)
==
不会测试x
是否是列表的元素;它会检查列表中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)
答案 1 :(得分:2)
==
仅测试x是否等于列表,而不是。您必须使用函数elem
,它将一个元素和一个元素列表作为参数,如果元素在列表中,则返回true
。所以你的代码将是:
replace [] = []
replace (x:xs) =
if elem x ['0'..'9']
then '7' : replace xs
else x : replace xs