۲۸ - ۵آی-او اشتراک‌گذاری رو برای همه چیز لغو نمی‌کنه

همونطور که قبلاً هم گفتیم، ‏‎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 w
Prelude> main
outer trace
blah
blah
inner trace
woot
woot

inner و outer فقط یک بار ساتع شدن، چون ‏‎IO‎‏ قرار نیست برای مقادیری که داخلِ ‏‎IO‎‏ نیستن و ممکنه در طولِ اجرایِ یک اجراییه ِ ‏‎IO‎‏ ازشون استفاده میشه، اشتراک‌گذاری رو لغو کنه.