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)
我不知道我的错误在哪里.
你在这里硬编码了'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 = 0Run 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 xRun 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)