我正在尝试学习一些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)
的组合concat和map足够常见的有,结合他们的标准功能.
concatMap (\y -> if y == 'F' then "FLD" else [y]) "FLF"
Run Code Online (Sandbox Code Playgroud)