验证Haskell中的多位数整数
我正在编写一个小的标记器程序,分别识别每个字符串输入。然而,当我用多位数(比如“256”)测试它时,它给了我一个字符串标记[2,5,6],这不是我所期望的验证Haskell中的多位数整数,haskell,Haskell,我正在编写一个小的标记器程序,分别识别每个字符串输入。然而,当我用多位数(比如“256”)测试它时,它给了我一个字符串标记[2,5,6],这不是我所期望的 import Data.Char data Token = Number Integer deriving (Show, Eq) tokenize :: String -> [Token] tokenize (c:cs) | isDigit c = Number (read [c]) : tokenize cs
import Data.Char
data Token = Number Integer
deriving (Show, Eq)
tokenize :: String -> [Token]
tokenize (c:cs)
| isDigit c = Number (read [c]) : tokenize cs
| otherwise = error
如何使isDigit
处理大于9的整数?(有两个或更多数字)这是一个提示:
> import Data.Char
> span isDigit "123abc456"
("123","abc456")
span isDigit
返回一对:仅由数字组成的最长前缀,以及字符串的其余部分。这是一个提示:
> import Data.Char
> span isDigit "123abc456"
("123","abc456")
span isDigit
返回一对:仅由数字组成的最长前缀,以及字符串的其余部分。您编写它的方式将不会编译-isDigit
与tokenize
相同吗?你能给我们你的工作代码吗?除了我的评论之外,一个简单的tokenize s=[Number$read s]
将完成这个部分的工作(如果你希望tokenize“256”=[Number 256]
我刚刚编辑了代码。我想我必须去掉tokenize cs
部分,因为你编写它的方式不会编译-isDigit
与tokenize
相同吗?你能给我们你的工作代码吗?除了我的评论之外,一个简单的tokenize s=[Number$read s]
将完成这部分的工作(如果您希望tokenize“256”=[Number 256]
我刚刚编辑了代码。我想我必须摆脱tokenize cs
部分,但如果我尝试123+456
它会不会变成[123,+456]
?因为加号与456
@Walle一起被视为一个字符串。是的。你仍然需要一些递归,就像在你发布的代码中一样,还需要处理+
或你的语言中可能有的其他非数字标记。是的,但是如果我尝试123+456
它不会变成[123,+456]
?由于加号与456
@Walle一起被视为一个字符串,因此您仍然需要在发布的代码中进行一些递归,以及处理+
或您语言中可能有的其他非数字标记。