2012-07-23 41 views
0

比方說,我要考慮的形式哈斯克爾正則表達式和讀取字符串作爲整數

[int_1, int_2, ..., int_n] 
[int_1, int_2, ..., int_m] 
... 

該輸入是從文本文件中讀入的輸入。我的目標是獲得這個列表的最大尺寸。目前,我有一個正則表達式識別這種模式:

let input = "[1,2,3] [1,2,3,4,5]" 
let p = input =~ "(\\[([0-9],)*[0-9]\\])" :: [[String]] 

輸出:

[["[1,2,3]","[1,2,3]","2,"],["[1,2,3,4,5]","[1,2,3,4,5]","4,"]] 

所以我後是第三個指數+ 1的最大但是,當我被困正試圖把這個指數看作一個整數。比如我可以參考的元素就好了:

(p !! 0) !! 2 
> "2," 

但我不能將它轉換爲一個int,我已經試過

read((p !! 0) !! 2) 

然而,這並不儘管工作

:t (p !! 0) !! 2 
> (p !! 0) !! 2 :: String 

看起來是一個字符串。任何意見,爲什麼我不能讀這個int作爲將不勝感激。

再次感謝。

+0

如果您需要列表的長度,則不需要轉換爲整數值。 使用'length $(讀取「[1,2,3,4,5]」:: [Int])有效。 – 2012-07-23 14:02:34

回答

4

我不完全確定你的方法是我推薦的方法,但我正在努力將自己的頭圍繞目標,所以我只是回答這個問題。

問題是read "2,"不能產生一個Int,因爲有一個剩餘的逗號。你可以使用reads來解決這個問題。 reads產生可能的解析的列表,並遺留下來的字符串,所以:

Prelude> (reads "2,") :: [(Int,String)] 
[(2,",")] 

在這種情況下,它是明確的,所以你得到一個解析,從中可以再拔出INT,雖然你的未來自我方面尊重表明是防禦性的,而不是假設總是會有一個有效的解析(安全模塊對這類事情有好處)。

或者,您可以修改您的正則表達式,使其不包含匹配組中的逗號。