【发布时间】:2018-09-03 00:20:31
【问题描述】:
我正在尝试在 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 中)可以简单地终止一个函数并返回一个值?当然,关于这个函数的实现的建议会很棒!
提前致谢!
【问题讨论】:
-
否则我觉得返回
0有点奇怪。通常在 Haskell 中,然后使用Maybe Int,从那时起我们可以区分Nothing和Just 0。 -
很遗憾,这是一道练习题,它指定了函数声明,接受一个字符串并返回一个整数。
-
在这种情况下,我建议返回
-1,因为这是一个不能仅用数字表示的数字。 -
问题是,在处理
"10"时,递归调用会返回0,至于"1a"的情况,很难区分这两种情况。 -
48 <= fromEnum c可能比'0' <= c更具可读性(其他比较也是如此)。
标签: haskell