11

私は現在、Haskell を使用したプロジェクトに取り組んでおり、問題が発生しました。「dictionary.txt」ファイルの各行を読み取ってリストに挿入することになっていますが、そうすることができないようです。私はこのコードを持っています:

main = do
    let list = []
    loadNums "dictionary.txt" list

loadNums location list = do
    inh <- openFile location ReadMode
    mainloop inh list
    hClose inh

mainloop inh list = do 
    ineof <- hIsEOF inh
    if ineof
        then return ()
        else do 
            inpStr <- hGetLine inh
            inpStr:list
            mainloop inh list

すべての行を取得することになっています(「inpStr:list」を「putStrLn inpStr」に置き換えると、すべての行が正しく表示され、すべての行が表示されるため、すべての行が取得されることがわかっています)、リストに挿入しますが、次のエラーが発生します:

Couldn't match expected type `IO' against inferred type `[]'

おそらく、hGetLine が文字列ではなく、リストに挿入できる適切な文字列を取得するために処理する方法がわからない IO 文字列であるためです。これをどのように解決できるか、または問題が正確に何であるかはわかりませんが、ファイル内のすべての行を適切にリストに入れる方法を知っている人がいれば、感謝します。

前もって感謝します!

4

2 に答える 2

15

宿題か何かでない限り、そこまで力を入れる必要はありません。再利用は怠惰です!

getLines = liftM lines . readFile

main = do
    list <- getLines "dictionary.txt"
    mapM_ putStrLn list

しかし、あなたはまだ Haskell を学んでいるように見えるので、CesarB が書いたものを理解することが重要です。

于 2008-10-19T01:04:47.533 に答える
14

エラーが発生した行で、Haskell は「IO a」を期待していますが、[] を指定しています。物事を大幅に単純化すると、IO モナドの do ブロックでは、すべての行が次のいずれかになります。

  • 「IO a」型の値を返すもの。その中の「a」型の値は破棄されます (したがって、「a」は多くの場合「()」です)。
  • <- 式。同じことを行いますが、「a」型の値を破棄する代わりに、<- の左側に名前を付けます。
  • 値に名前を付けるだけの let

その do ブロックでは、"hGetLine inh" が "IO String" を返し、その中の String が抽出され、inpStr という名前が付けられます。次の行は、let でも <- でもないため、"IO a" 型にする必要がありますが、そうではありません (したがって、コンパイラ エラーが発生します)。代わりにできることは、すでに文字列を持っているため、let です。

let list' = inpStr:list

これにより、文字列の後に元のリストが続く新しいリストが作成され、「list'」という名前が付けられます。

次の行を変更して、"list" の代わりに "list' " を使用します (新しいリストを渡します)。その行は (再帰的に) mainloop を呼び出し、それはもう 1 行を読み取り、それ自体を呼び出します。ファイル全体を読み取った後、「IO ()」タイプの何かが返されます。この「IO()」は、loadNums の do ブロックに返されます。おめでとうございます。ファイルから読み取った行を逆の順序で (リストの先頭に追加していたため) リストを作成しただけで、何もしませんでした。

何かをしたい場合は、「return ()」を「return list」に変更してください。戻り値は、リストを含む「IO [String]」型の値を生成します (戻り値は値をカプセル化するだけです)。これは、<- 構文を使用して loadNums で抽出できます。

残りは読者の演習として残します。

于 2008-10-19T00:46:23.203 に答える