۲۸ - ۵آی-او اشتراکگذاری رو برای همه چیز لغو نمیکنه
همونطور که قبلاً هم گفتیم، IO اشتراکگذاری رو برای همه چیز لغو نمیکنه، اگر هم میکرد، عُقلایی نبود. اشتراکگذاری رو فقط برای مقدارِ نهاییای که بهش ساده میشه لغو میکنه. هنوز مقادیری که برای محاسبهشون، هیچ وابستگیای به IO ندارن رو میشه به اشتراک گذاشت، حتی توی یه اجراییه ِ بزرگترِ IO (مثل main).
برای مثالِ زیر دوباره از Debug.Trace استفاده میکنیم تا ببینیم کِی یه چیزی به اشتراک گذاشته میشه. برای blah، trace خارج از اجراییه ِ IO ِه، پس مینویسیم outer trace:
import Debug.Trace
blah :: IO String
blah = return "blah"
blah' = trace "outer trace" blahو برای woot، داخلِ اجراییه ِ IO مینویسیم inner trace:
woot :: IO String
woot = return (trace "inner trace" "woot")بعد هردوشون رو میندازیم توی یه اجراییه ِ IO ِ بزرگتر، main:
main :: IO ()
main = do
b <- blah'
putStrLn b
putStrLn b
w <- woot
putStrLn w
putStrLn wPrelude> main
outer trace
blah
blah
inner trace
woot
wootinner و outer فقط یک بار ساتع شدن، چون IO قرار نیست برای مقادیری که داخلِ IO نیستن و ممکنه در طولِ اجرایِ یک اجراییه ِ IO ازشون استفاده میشه، اشتراکگذاری رو لغو کنه.