List haskell中字符串修改和连接的组合

List haskell中字符串修改和连接的组合,list,haskell,List,Haskell,因此,我的问题是在haskell中获取一个字符串,并对其进行修改,这样,如果存在某些字符,它们将被更改为其他字符,我创建了一个帮助函数来实现这一点,但是有一种情况是,如果字符为“!”然后它就变成了!!!111oneone',所以我认为要做到这一点,您需要将当前字符串与'!!连接起来!!111oneone'的问题是,我的函数使用的是字符,但要做到这一点,我们需要使用字符串,您将如何组合这一点,即如果需要,请帮助修改字符,如果有“!”则执行转换 这是我到目前为止所拥有的 convert :: Str

因此,我的问题是在haskell中获取一个字符串,并对其进行修改,这样,如果存在某些字符,它们将被更改为其他字符,我创建了一个帮助函数来实现这一点,但是有一种情况是,如果字符为“!”然后它就变成了!!!111oneone',所以我认为要做到这一点,您需要将当前字符串与'!!连接起来!!111oneone'的问题是,我的函数使用的是字符,但要做到这一点,我们需要使用字符串,您将如何组合这一点,即如果需要,请帮助修改字符,如果有“!”则执行转换

这是我到目前为止所拥有的

convert :: String -> String
convert [] = []
convert (x:xs) =
| x == '!'  = !helper
| otherwise = converthelper x

假设你的助手是

helper :: Char -> String
helper '!' = "!!!111oneone"
helper c = [c]
然后可以使用
concatMap
helper
映射到字符串中的每个字符上,然后将结果连接到单个字符串中

convert :: String -> String
convert = concatMap helper
-- convert msg = concatMap helper msg
诀窍是帮助者将每个角色升级为一个角色列表;大多数字符只是成为对应的一个字符串,但是
变得更重要


(请注意,
concatMap
构成列表的
Monad
实例的基础。您还可以编写
convert msg=msg>>=helper

您可以使用
+
连接字符串。如果
c
是单个字符,则可以使用
[c]
将其转换为字符串(如果需要)。相反,
c:s
将char
c
前置到字符串
s
。好的,谢谢,我会尝试实现它!恭喜,你刚刚定义了一个L系统。(好的,从技术上来说,你还需要一个起始字符串。)嘿,我想我从来都不知道这个过程有一个正式的名称。(当然,在这种情况下,我们会在一轮替换后停止。)这是一个非常好的方法,但我担心对于一个不知道
++
]的初学者来说,这太高了,这比concatMap更基本<代码>迭代(>>=helper)
将为您提供整个序列。