[英]Problem with creating a list of string after a transform in Haskell
如果我得到诸如[“ Dog”,“ red”,“ caR”,“ HELLO”]之类的字符串列表,并且想使用fold指令将小写字母转换为大写字母,反之亦然,那么如何返回串?
返回值应类似于[“ dOG”,“ RED”,“ CAr”,“ hello”]
我有这个代码
convertWords :: [String] -> String
convertWords words= foldl(\ r it ->r++foldl(\ rr iitt ->if isUpper iitt then rr++[toLower iitt] else rr++[toUpper iitt]) [] it) [] words
问题是它返回了很好的转换,但是在以下列表中:
“dOGREDCArhello”
谢谢
如果我得到诸如[“ Dog”,“ red”,“ caR”,“ HELLO”]之类的字符串列表,并且想使用fold指令将小写字母转换为大写字母,反之亦然,那么如何返回串?
如果对于给定的字符串列表,您还希望具有字符串列表,则此类函数的类型将为convertWords :: [String] -> [String]
。
对于列表中的每个String
您都需要应用另一个函数,该函数将交换大小写convertWord :: String -> String
。 因此, convertWords = map convertWord
。
鉴于切换大小写仅适用于Char
和String = [Char]
,我们还需要具有convertChar :: Char -> Char
convertWord = map convertChar
convertChar :: Char -> Char
函数,因此convertWord = map convertChar
。
convertChar
定义可能如下所示:
convertChar :: Char -> Char
convertChar c | isUpper c = toLower c
| otherwise = toUpper c
最后,
convertWord :: String -> String
convertWord = map convertChar
convertWords :: [String] -> [String]
convertWords = map convertWord
我们有正确的结果:
>> convertWords ["Dog", "red", "caR", "HELLO"]
["dOG","RED","CAr","hello"]
it :: [String]
if then else
用作being upper or not being upper
的二进制条件, being upper or not being upper
与map
一起使用看起来像这样:
converter i = map (map(\x -> if isUpper x then toLower x else toUpper x)) i
如果您想使用foldl,我们需要查看foldl的签名:
foldl :: Foldable t => (b -> a -> b) -> b -> ta -> b
因此,我们可以创建一个函数来获取String的列表,一个String并在列表内返回该String的受控版本。
folder :: [String] -> String -> [String]
要与if then else
可以更轻松地看到区别,它看起来像这样:
folder :: [String] -> String -> [String]
folder xs "" = []
folder xs s = xs ++ [sb s]
where sb "" = ""
sb (c:cc) = if isUpper c then toLower c : sb cc else toUpper c : sb cc
当然可以,最好将其更改为与后卫匹配,我让你自己决定。
使用此功能folder
我们现在可以使用foldl
因为签名匹配。 给foldl
我们的folder
,一个空列表和输入列表作为参数将解决此问题:
converter' xs = foldl folder [] xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.