各行に 2 つのリストを含むテキスト ファイルがあります。各リストには、任意の数の英数字の引数を含めることができます。例 [t1,t2,...] [m1,m2,...] ファイルを ghc に読み込むことはできますが、これを別のメイン ファイルに読み込む方法と、メイン ファイルが各引数を個別に認識して処理する方法を教えてください。それ?
1 に答える
ほとんどのことはご自分で解決していただくのが一番だと思いますが、いくつかのヒントをご紹介します。まず、コードの残りの部分が機能するようになるまで、ファイル アクセスを処理しないようにしてください。そうしないと、あらゆる場所で 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