用Haskell语言切换案例

时间:2018-04-26 19:02:23

标签: function haskell functional-programming

我是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

请帮助我解决这个问题,非常感谢您的帮助。

3 个答案:

答案 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。您可以通过定义给定字符的映射来切换案例:

  1. 检查它是否为大写字符,如果是,则返回其小写字母;
  2. 检查它是否是小写字符,如果是,则返回其大写字母;和
  3. 否则返回原始角色。
  4. 我们可以实现如下功能:

    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