带有ord'x'的Haskell case语句

Kub*_*bun 2 string haskell sum case

import Data.Char  
x1 xs = sum(map (hilfsfunction) xs)
hilfsfunction x  
   | (ord 'x' > 97 && ord 'x' < 107) = (ord 'x' - 96)  
   | (ord 'x' > 48 && ord 'x' < 58) = (ord 'x' - 48)  
   | otherwise = 0  
Run Code Online (Sandbox Code Playgroud)

我需要编写一个程序,其中函数接受一个字符串,然后使用它进行以下操作:
- 如果字母是a,将其更改为1
- 如果字母是其他内容,我应该使用相同的数字.
- 所有其他符号应更改为0

我现在的问题是,无论第一个案例或第二个案例是否属实,每次启动此程序时,总和为0.

示例:让我们取"6":

*Main Data.Char> ord '6' > 48 && ord '6' < 58
True
Run Code Online (Sandbox Code Playgroud)

在这之后:

*Main Data.Char> ord '6' - 48
6
Run Code Online (Sandbox Code Playgroud)

但如果我接受我的功能,每次都是这样的话......:

*Main Data.Char> x1 "6"
[0]
Run Code Online (Sandbox Code Playgroud)

我不知道我的错误在哪里.

Wil*_*sem 6

你在这里硬编码了'x'角色而不是使用x变量:

import Data.Char  
x1 xs = sum(map (hilfsfunction) xs)
hilfsfunction x  
   | (ord 'x' > 97 && ord 'x' < 107) = (ord 'x' - 96)  
   | (ord 'x' > 48 && ord 'x' < 58) = (ord 'x' - 48)  
   | otherwise = 0
Run Code Online (Sandbox Code Playgroud)

所以这意味着Haskell不关心x它的价值是什么:它只会使用'x'.

请注意,在这里你写了一个相当神秘的函数,你可以通过与其他字符进行比较以更清晰的方式编写它,并ord在你做算术时使用:

hilfsfunction :: Char -> Int
hilfsfunction x  
   | 'a' <= x && x <= 'z' = ox - ord 'a' + 1
   | '0' <= x && x <= '9' = ox - ord '0'
   | otherwise = 0
    where ox = ord x
Run Code Online (Sandbox Code Playgroud)

这里很清楚乍一看(不知道ASCII的轮廓)你首先检查是否x在范围内['a'..'z'],如果是这种情况你基本上使用它的序列号.如果不是,你检查它是否在范围内['0' .. '9']然后使用它的数字对应物,否则你返回0.实际上你在实现中犯了一个错误,因为它ord 'z'122,而不是107.虽然你可以使用122,通过比较'z',它可能不太可能出错,因为你让Haskell将字符翻译成其ASCII代码等价物.

根据新的定义hilsfsfunction,我们获得:

Prelude Data.Char> x1 "6aa@a1a~dwfwf123"
79
Run Code Online (Sandbox Code Playgroud)