迭代字符串并用haskell中的子字符串替换单个字符

Joh*_*doe 7 haskell

我正在尝试学习一些Haskell,我发现它很难.我在当前的项目中遇到了一些问题.我的想法是,我必须通过一个字符串并用新的子字符串替换某些字符.例如,如果我有一个字符串"FLXF",并且我想用名为"FLF"的子字符串替换每个F,则结果应为"FLFLXFLF".现在我几个小时一直在研究这个特定的问题.我一直在阅读可能派上用场的各种类型,不同的功能(地图,折叠等),但我还是无法解决这个问题.

下面的代码是我的一些不同的尝试:

apply :: String -> String
apply []     = []
apply (x:xs) = if (x == 'F')
               then do show "Hello"
                       apply xs
               else (apply (xs))
Run Code Online (Sandbox Code Playgroud)

这个例子在这里我只是试图在每次遇到'F'时显示你好,但它显示的只是"",所以这显然不起作用.我真的不确定if else语句是否可以去这里.我也在想功能图可能会起作用.这里我想的代码看起来像这样:

map (\x y -> if y == 'F' then "FLD" else y) "FLF"
Run Code Online (Sandbox Code Playgroud)

但这给了我一个类型错误.所以你可以看到我迷路了.请原谅我对Haskell的愚蠢知识,但我还是新手.我真的希望你们中的一些人可以帮助我,或者让我朝着正确的方向努力.如果我不清楚某些事情,请随时提问.

先感谢您!

约翰

dav*_*420 14

map (\x y -> if y == 'F' then "FLD" else y) "FLF"
Run Code Online (Sandbox Code Playgroud)

这几乎是正确的.

首先......为什么函数有两个参数?

map (\y -> if y == 'F' then "FLD" else y) "FLF"
Run Code Online (Sandbox Code Playgroud)

剩下的类型错误是因为then分支给出了a String,但是else分支给出了a Char(两个分支必须各自给出相同类型的值).所以我们将让else分支给出一个String代替(回想起它String是一个同义词[Char]):

map (\y -> if y == 'F' then "FLD" else [y]) "FLF"
Run Code Online (Sandbox Code Playgroud)

现在的问题是,这给你一个[String]值而不是一个String.所以我们将所有这些字符串连接在一起:

concat (map (\y -> if y == 'F' then "FLD" else [y]) "FLF")
Run Code Online (Sandbox Code Playgroud)

的组合concatmap足够常见的有,结合他们的标准功能.

concatMap (\y -> if y == 'F' then "FLD" else [y]) "FLF"
Run Code Online (Sandbox Code Playgroud)