gpt4 book ai didi

haskell - 在 Haskell 中将数字字符串转换为 int

转载 作者:行者123 更新时间:2023-12-02 16:43:04 26 4
gpt4 key购买 nike

我正在尝试在 Haskell 中编写这个名为 scanString 的函数,它接受一个字符串,如果它仅由数字组成,则将其转换为 int,否则应返回 0。

例如,scanString“123”= 123,但 scanString“12a”= 0。

这是我迄今为止的实现:

scanChar :: Char -> Int
scanChar c
| 48 <= fromEnum c && fromEnum c <= 57 = (fromEnum c) - fromEnum '0'
| otherwise = 0

scanString :: String -> Int
scanString str = case str of
[] -> 0
x:xs
| 48 <= fromEnum x && fromEnum x <= 57 ->
((scanChar x) * (10 ^ ((length str) -1 ))) + scanString xs
| otherwise -> 0

这段代码没有做正确的事情,因为 scanString "3a"会给出 30。

是否有一种方法(如 Java 或 Python)可以简单地终止函数并返回一个值?当然,如果能就这个功能的实现提出建议那就太棒了!

提前致谢!

最佳答案

我认为这里的主要问题是您让 scanChar::Char -> Int 返回零字符 ('0') 以及返回零对于其他角色。因此,scanString 必须包含额外的逻辑,这只会使其更加复杂。

因此,我们可以通过返回 -1 来清理 scanChar(或者我们可以让它返回 Maybe Int 并让它return Nothing,无论你具体如何指定,关键是尽量将检查逻辑封装在一个函数中,这样我们就不用再关心它了)。例如:

scanChar :: Char -> Int
scanChar c | '0' <= c && c <= '9' = fromEnum c - fromEnum '0'
| otherwise = -1

现在我们可以将所有数字解析逻辑封装在scanChar中。现在我们仍然需要实现scanString::String -> Int。这可以通过编写一个与累加器一起使用的额外函数来完成。例如:

scanString :: String -> Int
scanString = go 0
where go a s = ...

所以这里 go 充当模拟某种 while 循环的函数。 a 参数是累加器,我们通过递归调用传递该参数,每次我们都可以用更多数据更新它。最初我们将其设置为零。

go 函数基本上有三种情况:

  • 到达字符串末尾,我们可以返回累加器;
  • 字符串的第一个字符不是数字,我们返回0;和
  • 字符串的第一个字符是数字,我们将累加器乘以10,加上解析后的值,并对字符串的尾部执行递归。

因此,我们可以实现这三种情况,例如:

scanString :: String -> Int
scanString = go 0
where go a [] = a
go a (x:xs) | 0 <= sc && sc <= 9 = go (10*a+sc) xs
| otherwise = 0
where sc = scanChar x

关于haskell - 在 Haskell 中将数字字符串转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49464632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com