Home Articles

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

Asked
Viewed 571 times
1

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

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

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

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

任何帮助将不胜感激 .

2 Answers

  • 2

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

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

  • 1

    你只处理空字符串 "" 的情况 . 你要这个:

    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
    

Related