繁体   English   中英

在Haskell中进行转换后创建字符串列表的问题

[英]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

鉴于切换大小写仅适用于CharString = [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 uppermap一起使用看起来像这样:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM