2017-09-29 6 views
1

私はHaskellの本を読んでいて、何を理解しようとしていますIO共有の値を無効にする

は、次の例を考えてみましょう:

import Debug.Trace 
blah :: IO String 
blah = return "blah" 
blah' = trace "outer trace" blah 

woot :: IO String 
woot = return (trace "inner trace" "woot") 

main :: IO() 
main = do 
    b <- blah' 
    putStrLn b 
    putStrLn b 
    w <- woot 
    putStrLn w 
    putStrLn w 

GHCiの中出力:

Prelude> main 
outer trace 
blah 
blah 
inner trace 
woot 
woot 

その後、著者は言う:我々は唯一の内側と外側が一度あるため放出されました

IOは で値の共有を無効にすることはできませんIOアクションの実行中に が使用されたIO内に存在しません。

投稿者は何と言っていますか?

あなたがIOの内部の値を参照するために<-を使用し、bwString値となる:引用符が解析するのは難しいようですが、ここで私はそれが意味思い何ん

答えて

3

Stringの値は純粋です(情報は透明です)ので、共有することができます。

値を共有する機能は、純粋な関数と値の利点です。純粋な関数から不純な関数を呼び出すことはできませんが、純粋な関数を純粋なコンテキストから呼び出すことはできますが、不純なコンテキストでは参照の透明な部分のプロパティを変更したくありません。

あなたあなたが二回putStrLn bを呼び出すときにbがないように、putStrLn bを呼び出すの評価を行った結果にバインドされているので、それを遅延二回blah'を評価するだろうが、それはないと思うことができるようにHaskellのはいい加減に評価され、 putStrLn bそれ自身。

つまり、複数の関数呼び出し間で参照値を共有することができます。IOは、そのプロパティを無効にしません。

+0

'最後に、いくつかの関数呼び出しの間に参照値を明示的に共有する 'という例文を参考にしてください。 –

+0

@zero_coding OPコードには2つの例があります: 'b'は' putStrLn'を2回呼び出す間に共有され、 'w'も同様です。 –

+0

これら2つは「参照的に透過的な値」です。 –

関連する問題