如果你擺脫了-
條目,你可以很快做到這一點作爲
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數據類型來表示對列表中的某些點沒有值;我們可以使用-
作爲Nothing
和a
的簡寫,作爲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]]
其實,我想將其轉換成[也許INT]]。 ' - '將被翻譯爲Nothing。 '3'將會是Char Char。但是一個字符串是相當一般的,它是未知的類型,只是知道參數是由一個空格或多個空格分隔的,而且它們被寫入很多行(不是一行) – chipbk10
這個編輯使得它更清晰,謝謝。 – AndrewC
您可能對[這個問題]的答案感興趣(http://stackoverflow.com/questions/13553794/read-instance-causes-parse-error/13554910#13554910) – AndrewC