2015-06-21 30 views
0

我正在寫一個小標記器程序來分別標識每個字符串輸入。然而,當我測試它與多個數字號碼說「256」它給了我一個[數字2,數字5,數字6]這是不是我所期望的字符串標記。驗證Haskell中的多位數整數

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的整數工作? (具有2首或更多個數字)

+0

你寫它的方式不會編譯 - isDigit和tokenize是一樣的嗎?你能給我們你的工作代碼嗎? – Carsten

+0

除了我的評論,一個簡單的'tokenize s = [Number $ read s]'將完成這部分的工作(如果你期望'tokenize「256」= [Number 256]' – Carsten

+0

我剛剛編輯了代碼。我必須擺脫'tokenize cs'部分 – Walle

回答

4

這是一個暗示:

> import Data.Char 
> span isDigit "123abc456" 
("123","abc456") 

span isDigit返回一個對:通過僅使用數字的最長的前綴,而串的其餘部分。

+0

對,但如果我試過'123 + 456'不會變成'[123,+456]'?因爲加號的大小與456 ' – Walle

+0

@Walle是的,你仍然需要一些遞歸,就像在你的發佈代碼中一樣,以及處理'+'或者你的語言中的其他非數字標記。 – chi