新手学习Haskell中的递归函数,想知道如何创建递归函数toUpper和toLower,它们接收Chars列表并返回相同的Chars列表但是大小写?我尝试使用chr和ord函数解决它,但是ord的签名是Char - > Int而不是[Char] - > [Int]所以它与toUpper和toLower不匹配。有什么想法吗?
答案 0 :(得分:3)
这正是map
函数的作用:它采用a -> b
类型的函数(对于任何类型a
和b
)并返回一个新函数{{ 1}}。
[a] -> [b]
这使您可以将整个字符串转换为其Unicode代码点:
> :t ord
ord :: Char -> Int
> :t map ord
map ord :: [Char] -> [Int]
或返回
> map ord "foo"
[102,111,111]
要实施您的方法,您只需要定义适当的函数> map chr [102,111,111]
"foo"
和toLower
以与
toUpper
(请注意,模块> map chr (map toLower (map ord "MyStRiNg"))
mystring
> map chr (map toUpper (map ord "MyStRiNg"))
MYSTRING
已经提供Data.Char
;您可以使用它们来检查自己的实现。)
答案 1 :(得分:-3)
没关系,现在就明白了。如果有人需要它:
toUpper::[Char] -> [Char]
toUpper [] = []
toUpper (x:xs) = chr(ord(x)-32):toUpper(xs)
toLower::[Char] -> [Char]
toLower [] = []
toLower (x:xs) = chr(ord(x)+32):toLower(xs)