如何在Haskell中更改“ord”函数的签名?

时间:2016-05-23 18:54:15

标签: function haskell recursion

新手学习Haskell中的递归函数,想知道如何创建递归函数toUpper和toLower,它们接收Chars列表并返回相同的Chars列表但是大小写?我尝试使用chr和ord函数解决它,但是ord的签名是Char - > Int而不是[Char] - > [Int]所以它与toUpper和toLower不匹配。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这正是map函数的作用:它采用a -> b类型的函数(对于任何类型ab)并返回一个新函数{{ 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)