-2

次のように、入力を文字列として読み取るためにReadクラスのインスタンスを書き込もうとしています。

"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)

List of Charを使って書いてみましたが、手間がかかります。何か提案はありますか?申し訳ありませんが、私はHaskellを初めて使用するので、その質問をします。:(

4

1 に答える 1

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)]]

しかし、維持するのは-どうですか?リスト内の特定のポイントに値がないことを表すには、多分データ型を使用する必要があります。の省略形およびの省略-形として使用できます。NothingaJust 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]]
于 2012-11-24T23:52:50.980 に答える