8

私はまだHaskellを探求し始めています。私はこのコードがIOモナドで「実行」されることを知っています。そのl <- ...行から次の行に移動すると、IO - bindが呼び出されます。

Haskellは怠惰なので、l評価されることはないと考えることができます。しかし、「bind」は常に前のコマンドを評価します、そうですか?プログラムが「file-not-found」エラーを生成するためです。

main = do
    l <- mapM readFile [ "/tmp/notfound" ]
    return ()
4

2 に答える 2

15

Haskellは怠惰なので、lは評価されないと考えることができます。

はい、評価されることはありません。(>>=)ただし、 inの定義によりIO、アクションreadFile "/tmp/notfound"が実行されます。これは、ランタイムがファイルを開こうとすることを意味します。そのようなファイルがない場合、「ファイルが見つかりません」エラーが発生します。そのようなファイルがあれば、それは開かれますが、その内容は要求されるまで読み取られません。上記では、要求されていないため、内容は読み込まれません。

ここ評価される(そして実行される)のは、アクションを生成することlです。ファイルが存在しないため、エラーが発生します。

于 2012-12-01T20:40:17.133 に答える
9

doコードの表記を展開すると、次のようになります。

main = (mapM readFile ["/tmp/notfound"]) >>= (\l -> return ())

そうlです、決して評価されませんが、それはへの呼び出しmapMが決して評価されないという意味ではありません。>>=少なくともある程度の値を生成するために、常に左側のオペランドを評価する必要があります(少なくとも、IOモナドおよび頭に浮かぶ他のモナドでは)。

于 2012-12-01T20:42:50.360 に答える