ابتدای محتوای صفحه
۲۶ - ۴اون طرفی چه شکلی میشه؟
در زبانهای اکید، بطور معمول نمیشه یه محاسبه رو بدونِ انجام همهی محاسباتش به یه اسم انقیاد داد.
با استفاده از این مثال، محاسبات داخل-به-بیرون و بیرون-به-داخل (اکید و نااکید) رو با هم مقایسه میکنیم:
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
رو اجبار کنیم استثنا میگیریم – بیرون به داخل.