20

ファイル全体を文字列に読み込んでから、関数を使用して文字列の行を取得したいと思いlinesます。私はこれらのコード行でそれをやろうとしています:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
   linesOfFiles <- lines content

しかし、広告をコンパイルすると次のエラーが発生します。失敗します。

Couldn't match expected type `IO t0' with actual type `[String]'
In the return type of a call of `lines'
In a stmt of a 'do' block: linesOfFiles <- lines content

readFile結果をコンテンツにバインドすることで、DataTypeになると思いましたStringが、なぜですか?

4

1 に答える 1

48

readFileの結果をコンテンツにバインドすることで、文字列データ型になると思いましたが、なぜですか?

確かに、それはStringコンパイラが文句を言うことではありません。コードを見てみましょう:

main = do
   args <- getArgs
   content <- readFile (args !! 0)

content、必要に応じて、プレーンStringです。そして、lines contentです[String]。しかし、次の行でモナディックバインディングを使用しています

   linesOfFiles <- lines content

IO ()do-blockで。IO somethingしたがって、コンパイラは、の右側に型の式を期待します<-が、を検出し[String]ます。

計算lines contentには何も含まれないためIO、結果をletモナディックバインディングではなくバインディングでバインドする必要があります。

   let linesOfFiles = lines content

そこに必要なラインです。

于 2012-06-13T20:04:23.410 に答える