2012-11-24 224 views
-2

我試圖寫讀類的實例來讀取輸入的字符串如下:閱讀字符串輸入

"1 3 -  
- 2 3  
- - 5" 

轉換成[[Maybe Int]]

「 - 」將被翻譯成Nothing 「 3" 將是Just 3

"('a',3) - ('b',7) 
('c',5) ('e',0) - 
('d',9) - ('h',8)" 

轉換成[[Maybe (Char,Int)]]

「 - 」將被翻譯成沒什麼 「(‘A’,3)」將Just ('a',3)

我試圖用字符的處理列表給他們寫,但它需要大量的工作。你有什麼建議嗎?對不起,我對Haskell很新,所以我問你這個問題。 :(

+0

其實,我想將其轉換成[也許INT]]。 ' - '將被翻譯爲Nothing。 '3'將會是Char Char。但是一個字符串是相當一般的,它是未知的類型,只是知道參數是由一個空格或多個空格分隔的,而且它們被寫入很多行(不是一行) – chipbk10

+0

這個編輯使得它更清晰,謝謝。 – AndrewC

+0

您可能對[這個問題]的答案感興趣(http://stackoverflow.com/questions/13553794/read-instance-causes-parse-error/13554910#13554910) – AndrewC

回答

4

如果你擺脫了-條目,你可以很快做到這一點作爲

Prelude> (map (map read) . map words. lines $ "('a',3) ('b',4)\n('c',5)")::[[(Char,Int)]] 
[[('a',3),('b',4)],[('c',5)]] 

或者將其定義爲功能

genericReadLines :: Read a => String -> [[a]] 
genericReadLines = map (map read) . map words. lines 

,你可以這樣使用:

*Main> (genericReadLines "('a',3) ('b',4)\n('c',5)")::[[(Char,Int)]] 
[[('a',3),('b',4)],[('c',5)]] 

但你可能會發現它更容易做

readCharInts :: String -> [[(Char,Int)]] 
readCharInts = genericReadLines 

readInts :: String -> [[Int]] 
readInts = genericReadLines 

所以,你可以只輸入

*Main> readInts "1 2 3\n4 5 6\n7 8 9" 
[[1,2,3],[4,5,6],[7,8,9]] 
*Main> readCharInts "('a',3) ('b',4)\n('c',5)" 
[[('a',3),('b',4)],[('c',5)]] 

但是關於保持-什麼?您必須使用Maybe數據類型來表示對列表中的某些點沒有值;我們可以使用-作爲Nothinga的簡寫,作爲Just a的簡寫。

read' :: Read a => String -> Maybe a 
read' "-" = Nothing 
read' xs = Just (read xs) 

我要提醒你,代碼是脆弱的,如果你的數據也可能會被'-',但也許它不能。

genericMaybeReadLines :: Read a => String -> [[Maybe a]] 
genericMaybeReadLines = map (map read') . map words. lines 

然後我們就可以有

readMaybeCharInts :: String -> [[Maybe (Char,Int)]] 
readMaybeCharInts = genericMaybeReadLines 

readMaybeInts :: String -> [[Maybe Int]] 
readMaybeInts = genericMaybeReadLines 

所以現在我們能做的

*Main> readMaybeCharInts "('a',3) ('b',4)\n- ('c',5)" 
[[Just ('a',3),Just ('b',4)],[Nothing,Just ('c',5)]] 
*Main> readMaybeInts "2 3 -\n4 - 2" 
[[Just 2,Just 3,Nothing],[Just 4,Nothing,Just 2]] 
+0

我仍然必須處理' - ' ,並且字符串中的變量可以由一個或多個空格分隔。對不起,沒有足夠清楚 – chipbk10

+1

@ chipbk10我認爲這個新的編輯可能會做你想做的。 – AndrewC

+0

哇,太好了。非常感謝@AndewC。我知道了。我正在尋找一些像Pandoc或Text.Parsec這樣的模塊。但是,我們可以在不使用解析器的外部模塊的情況下解析它,這真是一個驚喜。 – chipbk10