函数中的非穷举模式:将字符串转换为ord值列表

时间:2013-11-28 21:59:03

标签: haskell converter

我是Haskell的新手并且编码一般,并且遇到了一些问题。

sti :: [Char] -> [Integer]
sti "" = [fromIntegral (ord x)| x<-""]

所以我试图用上面的方法创建一个字符串中的整数列表,例如"Hello"变为['H','e','l','l','o']然后我将该列表转换为Data.Char各自的ord值1}}。

我的问题是,当我尝试使用此功能时,我得到:函数sti中的非详尽模式。这是否意味着有些情况下我无法获取字符串的ord x?如果是这样,我将如何解决这个问题?

任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

您只处理空字符串""的大小写。你想要这个:

sti :: [Char] -> [Integer]
sti xs = [fromIntegral (ord x) | x <- xs]

xs是一个变量,可以匹配任何内容,这就是你想要的。

请注意,您可以使用模式匹配来实现特殊情况,例如:

sti :: [Char] -> [Integer]
sti "" = [1,2,3]
sti xs = [fromIntegral (ord x) | x <- xs]

当输入为空字符串时,此函数返回输入字符串中除之外的字符的ASCII字符值,在这种情况下,它返回[1,2,3]。这可能是一个有用的功能,即使它不是你想要的。

如果实现特殊情况,并且保留为您的函数定义了没有值的情况,那么如果您尝试评估这些情况的函数,则会崩溃:

Prelude Data.Char> let sti "" = [fromIntegral (ord x) | x <- ""]
Prelude Data.Char> sti "foo"
*** Exception: <interactive>:9:5-45: Non-exhaustive patterns in function sti

答案 1 :(得分:1)

您正在使用"",就像它是变量名一样。但在Haskell中,它代表空字符串。因此,您的函数仅针对空字符串定义,并且在所有其他情况下将为您提供非详尽的模式错误。

你应该用适当的变量名替换它。