0

各行に 2 つのリストを含むテキスト ファイルがあります。各リストには、任意の数の英数字の引数を含めることができます。例 [t1,t2,...] [m1,m2,...] ファイルを ghc に読み込むことはできますが、これを別のメイン ファイルに読み込む方法と、メイン ファイルが各引数を個別に認識して処理する方法を教えてください。それ?

4

1 に答える 1

2

ほとんどのことはご自分で解決していただくのが一番だと思いますが、いくつかのヒントをご紹介します。まず、コードの残りの部分が機能するようになるまで、ファイル アクセスを処理しないようにしてください。そうしないと、あらゆる場所で IO が発生する可能性があります。いくつかのサンプル データから始めます。

sampleData = "[m1,m2,m3][x1,x2,x3,x4]\n[f3,f4,f5][y7,y8,y123]\n[m4,m5,m6][x5,x6,x7,x8]"

コードの他の場所に言及するべきではありませんsampleDataが、テストのために ghci で使用する必要があります。

必要なすべてを実行する関数を取得したら、たとえば、processLists::String->[(String,String)]次のように置き換えることができますreadFile "data.txt" :: IO String

readInLists :: FilePath -> IO [(String,String)]
readInLists filename = fmap processLists (readFile filename)

意味がわからない場合は、私が誤って書いfmapたチュートリアルを読むことができます。

それらが本当に英数字である場合は、非常に簡単に分割できます。ここでは、いくつかの便利な関数を例とともに示します。

tail :: [a] -> [a]
tail "(This)" = "This)"

これを使用して、ストリングの前に不要なものを捨てることができます。

break :: (Char->Bool) -> String -> (String,String)
break (== ' ') "Hello Mum" = ("Hello"," Mum")

したがってbreak、テストを使用して 2 番目の文字列の最初の文字を見つけ、その直前の文字列を分割します。ブレーク文字がまだ次の文字列の先頭にあることに注意してください。spanは同じですが、最初のリストに何を含めるかのテストを使用するため、

span :: (Char->Bool) -> String -> (String,String)
span (/= ' ') "Hello Mum" = ("Hello"," Mum")

これらの関数は、、、(==',')またはisAlphaNum(import Data.Charファイルの先頭で使用する必要があります) などで使用できます。

あなたは関数を見たいと思うかもしれません、splitWithそしてsplitOn私はこの答えに持っています。それらはプレリュードの定義splitに基づいています。words

于 2012-10-31T01:30:55.397 に答える