۲۶ - ۱۲توسعه‌های 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‎‏ استفاده می‌کنین، می‌تونین به صورتِ موردی تنبلی رو احیا کنین.