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

Ani*_*il 0 haskell functional-programming function

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

这是我的功能.

replace [] = []
replace (x:xs) =
    if x == ['0'..'9']
    then '7' : replace xs
    else x : replace xs
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

==不测试if是否x是列表的元素; 它会检查是否x等于到列表中.请改用此elem功能.

replace [] = []
replace (x:xs) =
    if x `elem` ['0'..'9']
    then '7' : replace xs
    else x : replace xs
Run Code Online (Sandbox Code Playgroud)

if是一个纯表达式,可以在任何可以使用其他表达式的地方使用,因此您不需要重复递归调用xs:

replace [] = []
replace (x:xs) = (if x `elem` ['0'..'9'] then '7' else x) : replace xs
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用map而不是使用显式递归.

replace xs = map (\x -> if x `elem` ['0'..'9'] then '7' else x) xs
Run Code Online (Sandbox Code Playgroud)

要不就

replace = map (\x -> if x `elem` ['0'..'9'] then '7' else x)
Run Code Online (Sandbox Code Playgroud)

您可能想要使用Data.Char.isDigit:

import Data.Char
replace = map (\x -> if isDigit x then '7' else x)
Run Code Online (Sandbox Code Playgroud)