۲۶ - ۴اون طرفی چه شکلی میشه؟

در زبان‌های اکید، بطور معمول نمیشه یه محاسبه رو بدونِ انجام همه‌ی محاسبات‌ش به یه اسم انقیاد داد.

با استفاده از این مثال، محاسبات داخل-به-بیرون و بیرون-به-داخل (اکید و نااکید) رو با هم مقایسه می‌کنیم:

module OutsideIn where

hypo :: IO ()
hypo = do
  let x :: Int
      x = undefined
  s <- getLine
  case s of
    "hi" -> print x
    _    -> putStrLn "hello"

برای یه زبانِ اکید، این مشکل داره. یه زبانِ اکید فقط در صورتی می‌تونه ‏‎hypo‎‏ رو محاسبه کنه که ‏‎x‎‏ تهی نباشه. دلیل‌ش اینه که زبان‌های اکید، تهی رو قبل از انقیاد به ‏‎x‎‏ اجبار می‌کنن. زبانِ اکید به محضِ ورودِ یه انقیاد در گستره، محاسبه‌ش می‌کنه؛ نه زمانی که استفاده میشه.

تو هسکل (که نااکید ِه)، می‌تونین حدس بزنین اینجا چه اتفاقی میوفته:

Prelude> hypo
s
hello
Prelude> hypo
hi
*** Exception: Prelude.undefined

بطور کلی، یعنی محاسبه برمبنای نیاز انجام میشه، نه ساخته شدن. تنها در صورتی که محاسبه‌ی ‏‎x‎‏ رو اجبار کنیم استثنا می‌گیریم – بیرون به داخل.