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)
你对改善这个问题的建议是什么?
首先,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)
让我解释.此代码使用满足的Enum和Ord类型类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)
希望这可以帮助!