我是Haskell的新手,在定义带字符串类型参数的函数时遇到一些问题,返回字符串类型的结果,并将大写字母转换为小写字母,将小写字母转换为大写字母。我已分别为低位和高位转换定义了函数。
代码:
--upper case
func_upper :: String -> String
func_upper = map (\x-> if x>='a' && x<='z' then
toEnum(fromEnum x-32) else
x)
--Lower case
func_lower :: String -> String
func_lower = map (\x ->if x>='A' && x<='Z' then
toEnum (fromEnum x+32) else
x)
但是我无法将这两个函数组合在一起并创建一个将执行这两个操作的函数。我练习但失败了。我的练习代码是:
func_ ::String -> String
func_ x = if(x>='a' && x<='z') then toEnum (fromEnum x-32) else
if (x>='A' && x<='Z') then toEnum (fromEnum x+32) else
x
请帮助我解决这个问题,非常感谢您的帮助。
答案 0 :(得分:3)
首先,请注意,仅为单个字符定义功能就足够了。然后,您可以稍后将它们包装在map
中以使用字符串。
所以,你有
toUpper :: Char -> Char
toUpper x = if x>='a' && x<='z' then
toEnum(fromEnum x-32) else
x
toLower :: Char -> Char
toLower x = if x>='A' && x<='Z' then
toEnum (fromEnum x+32) else
x
......或者,因为他们写得更好
toUpper x
| x>='a' && x<='z' = toEnum $ fromEnum x - 32
| otherwise = x
toLower x
| x>='A' && x<='Z' = toEnum $ fromEnum x + 32
| otherwise = x
现在,这个保护语法的好处是你可以添加更多的子句。因此,您需要做的就是将两个函数的条件子句放在一个中。然后,第一个成功的将指定如何计算结果。
同样的事情也可以用if
来完成,但它需要在else
分支中进行笨拙的嵌套。
答案 1 :(得分:2)
你基本上在这里执行map
ping。您可以通过定义给定字符的映射来切换案例:
我们可以实现如下功能:
import Data.Char(isLower, isUpper, toLower, toUpper)
toggleChar :: Char -> Char
toggleChar x | isUpper x = toLower x
| isLower x = toUpper x
| otherwise = x
或不使用Data.Char
导入:
toggleChar :: Char -> Char
toggleChar x | 'A' <= x && x <= 'Z' = toEnum (fromEnum x - 32)
| 'a' <= x && x <= 'z' = toEnum (fromEnum x + 32)
| otherwise = x
然后我们可以map
ping toggleChar
来实现对整个字符串的切换:
toggleString :: String -> String
toggleString = map toggleChar
答案 2 :(得分:0)
此方法无需输入即可处理特殊字符和数字:
special = ['0'..'9'] ++ [' ', '!','@','#','$','%','^','&','*','(',')','_','-','+']
alphabet = ['a'..'z'] ++ special ++ ['A'..'Z'] ++ special
idx c (x:xs) | c /= x = 1 + idx c xs
| otherwise = 0
toggleChar s = alphabet !! mod (idx s alphabet + 26 + length special) (length alphabet)
toggleString = map toggleChar