۲۶ - ۱۲توسعههای Strict و StrictData
اگه GHC 8.0 یا جدیدتر دارین، میتونین از توسعههای Strict و StrictData بهرهمند شین. این دوتا چیزی به مفهومِ زبان اضافه نمیکنن، فقط باعث میشن seq و الگوهای بنگ رو خودتون ننویسین. این توسعهها رفتارِ تابعهایی که توی ماژول تعریف شدن و با دادهسازهای تنبل کار میکنن رو تغییر میدن، اما تأثیری در رفتار دادهسازهای تنبلی که از جاهای دیگه اومدن ندارن.
یه کم باهاشون بازی کنیم (البته اگه GHC 8.0 یا جدیدتر دارین؛ اگه ندارین این کُد کار نمیکنه):
{-# LANGUAGE Strict #-}
module StrictTest where
blah x = 1
main = print (blah undefined)مثالِ بالا تهی میشه، چون blah تحتِ توسعه ِ Strict در ماژول تعریف شده و به این ترجمه میشه:
blah x = x `seq` 1
-- یا با الگوهای بنگ
blah !x = 1پس کارِ توسعههای Strict و StrictData اینه که وقتی همهی (یا تقریباً همهی) کدِمون قراره اکید باشه، جلوی شلوغی رو بگیرن. برای احیای تنبلی، میتونین از یه تیلدا پشت الگوهای انکارناپذیر استفاده کنین:
{-# LANGUAGE Strict #-}
module LazyInHostileTerritory where
willForce x = 1
willNotForce ~x = 1اگه توی GHCi بهشون تهی بدیم:
Prelude> willForce undefined
*** Exception: Prelude.undefined
Prelude> willNotForce undefined
1پس حتی اگه از توسعه ِ Strict استفاده میکنین، میتونین به صورتِ موردی تنبلی رو احیا کنین.