我是Haskell的新手并且编码一般,并且遇到了一些问题。
sti :: [Char] -> [Integer]
sti "" = [fromIntegral (ord x)| x<-""]
所以我试图用上面的方法创建一个字符串中的整数列表,例如"Hello"
变为['H','e','l','l','o']
然后我将该列表转换为Data.Char
各自的ord值1}}。
我的问题是,当我尝试使用此功能时,我得到:函数sti
中的非详尽模式。这是否意味着有些情况下我无法获取字符串的ord x?如果是这样,我将如何解决这个问题?
任何帮助都会受到赞赏。
答案 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中,它代表空字符串。因此,您的函数仅针对空字符串定义,并且在所有其他情况下将为您提供非详尽的模式错误。
你应该用适当的变量名替换它。