原則として、haskellの型システムは純粋なものから不純な関数(すなわちf :: a -> IO b
)を呼び出すことを禁じていましたが、今日はreturn
で呼び出すことによってそれらがうまくコンパイルされることに気付きました。例では:今純粋な関数内のIOアクションの意味は何ですか?
h :: Maybe()
h = do
return $ putStrLn "???"
return()
、多分モナドでh
作品が、それにもかかわらず、純粋な機能です。実際にI/Oを実行することなく、コンパイルして実行するだけで、期待どおりにJust()
が返されます。私はhaskellの怠惰は物事を一緒に入れていると思う(すなわち、putStrLn
の戻り値は使用されていない - 値コンストラクタが隠されていて、それに対してパターンマッチングができないのでできない)。これを可能にする他の理由はありますか?
ボーナスとして、関連する質問:一般的に、他のものの中からモナドの行動の実行を禁止することは可能ですか?どうやって?
どのようにして、モナドに含まれている値とパターンマッチングする可能性を与えることで、モナドに別のアクションを実行させることができますか? –
モナドを別のモナドに変換するメソッドを作成するか、何らかの実行を行います。 'Control.Monad.ST.stToIO'は、例えば' ST'計算を 'IO'計算に変換します。 –
クリスタルクリア。あなたがた両方に感謝します! –