Haskell中这个替换函数的错误在哪里?

时间:2017-05-05 13:10:00

标签: function haskell functional-programming

我想写一个函数,它接受一个字符串并用7替换字符串中的任何数字。例如“foo123”将被替换为“foo777”

这是我的功能。

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

2 个答案:

答案 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