首次尝试Haskell:将小写字母转换为大写字母

Ale*_*ruC 2 haskell functional-programming

我最近开始学习Haskell,我已经尝试创建一个函数,以便将小写单词转换为大写单词,它可以工作,但我不知道它有多好,我有一些问题.码:

lowerToUpperImpl element list litereMari litereMici = 
 do
  if not (null  list) then
   if (head list) == element then
     ['A'..'Z'] !! (length ['A'..'Z'] - length (tail list ) -1)
   else
     lowerToUpperImpl element (tail list) litereMari litereMici
  else
    '0' --never to be reached

lowerToUpper element = lowerToUpperImpl element ['a'..'z'] ['A'..'Z'] ['a'..'z']

lowerToUpperWordImpl word  = 
 do 
  if not (null word) then
   lowerToUpper (head (word)):(lowerToUpperWordImpl (tail word))
  else
   ""
Run Code Online (Sandbox Code Playgroud)
  1. 我不喜欢我传递大写和小写字母的方式,我不能只声明一个全局变量或什么?
  2. 你的方法是什么填补死其他分支?

你对改善这个问题的建议是什么?

Ale*_*ing 8

首先,if/else通常被视为函数式编程语言中的拐杖,正是因为它们不是真的应该用作分支操作,而是用作函数.还记得列表在Haskell中不知道它们自己的长度,因此计算它是一个O(n)步骤.这对于无限列表尤其糟糕.

我会更喜欢这样写(如果我没有导入任何库):

uppercase :: String -> String
uppercase = map (\c -> if c >= 'a' && c <= 'z' then toEnum (fromEnum c - 32) else c)
Run Code Online (Sandbox Code Playgroud)

让我解释.此代码使用满足的EnumOrd类型类Char.fromEnum c转换c为ASCII码并将toEnumASCII码转换为等效字符.我提供的函数map只是检查字符是否为小写,如果是,则减去32('A'和'a'之间的差值),否则单独留下它.

当然,你总是可以写:

import Data.Char
uppercase :: String -> String
uppercase = map toUpper
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!