۱۱ - ۳سازندههای دادهها و تایپها
در هسکل دو سازنده وجود داره: نوعسازها و دادهسازها. نوعسازها فقط در سطح نوعی کاربرد دارن – در تایپ سیگنچرها و تعاریف تایپکلاسها و نمونههاشون. تایپها ایستا هستن و تکلیفشون در لحظهی کامپایل مشخص میشه. دادهسازها مقادیرِ در سطح جملهای رو میسازن، مقادیری که در لحظهی اجرا میشه باهاشون تعامل کرد. به این دلیل میگیم سازنده چون راهی برای ساخت یه مقدار یا تایپاند.
با اینکه به همهی نوعسازها و دادهسازها میگیم سازنده، باز هم میشه یه فرقی بین ثابت و سازنده قائل شد. نوعسازها و دادهسازهایی که هیچ آرگومانی نمیگیرن در واقع ثابت هستن. یعنی فقط یک تایپ یا مقدار ثابت رو ذخیره میکنن. مثلاً Bool
یه ثابتِ تایپ ِه، تایپی معیّن که برای تکمیل شدن منتظرِ هیچ آرگومانی نیست. دو مقداری که اونها هم ثابت هستن رو میشماره، True
و False
که هیچ آرگومانی نمیگیرن. با اینکه به True
و False
میگیم "دادهساز،" در حقیقت مقدارشون تعیین و مشخص شده و با آرگومان "ساخته" نمیشن.
گاهی اوقات هم لازم میشه در یه نوعداده چند تایپ یا مقدار رو ذخیره کنیم، که در این مواقع نوعسازها و دادهسازها رو پارامتردار میکنیم. وقتی یه سازنده آرگومان میگیره، حداقل از یک لحاظ مثل توابع میشه: باید اعمال بشه تا یه تایپ یا مقدارِ معیّن بده. نوعدادههای زیر مشابهِ چندتا از نوعدادههای هسکلاند. این نوعدادهها رو تعریف کردیم که بیشتر به گرامر تمرکز کنیم تا مفهوم اون تایپها، البته فعلاً.
data Trivial = Trivial'
-- [1] [2]
data UnaryTypeCon a = UnaryValueCon a
-- [3] [4]
۱.
نوعساز ِ Trivial
مثل یه مقدارِ ثابت میمونه، اما در سطح نوعی. هیچ آرگومانی نمیگیره و در نتیجه پوچگانه هست. در گزارش هسکل به اینها ثابتِ تایپ گفته شده تا از نوعسازهایی که آرگومان میگیرن متمایز بشن.
۲.
دادهساز ِ Trivial'
هم مثلِ یه مقدارِ ثابت میمونه ولی در سطح جملهای، مقادیر، یا فضای زمانِ اجرا وجود داره. این سه تا متفاوت از هم نیستن، هر سه تاشون یه چیزَن.
۳.
نوعساز با یه آرگومان: یه سازنده که منتظرِ یه ثابتِ تایپ ِه که بهش اعمال بشه. با این حال رفتارش مشابهِ رفتاری که از توابع میشناسیم نیست. چنین توابعِ سطحِ نوعی هم وجود دارن، ولی تو این کتاب توضیح نمیدیم.*
اگه به یادگیریِ این مبحث علاقه دارین، بلاگِ برنت یورگی مطالبی دربارهی خانوادههای تایپی و وابستگیهای تابعی داره که برای شروع مناسباند.
۴.
دادهساز با یک آرگومان. منتظرِ یه مقداره که بهش اعمال بشه. این هم مثل یه تابعِ سطح جملهای عملیاتی روی داده انجام نمیده. بیشتر شبیه یه جعبه میمونه که مقادیر میرَن توش. البته این توصیفِ جعبهای ممکنه بعداً گیجتون کنه – همهی آرگومانهای تایپی برای سازندهها معادل مقداری (یا شاهد مقداری) ندارن! به اونها میگیم خیالی.
هر دوی این نوعدادهها فقط یک دادهساز رو میشمارن. در تایپِ Trivial
، تنها مقدارِ معیّن Trivial'
ِه؛ اما UnaryValueCon
در زمان اجرا ممکنه مقادیر مختلفی داشته باشه – بستگی به a
ای که بهش اعمال میشه داره. نوعداده ِ لیست رو به یاد بیارین: در سطح نوعی داشتیم a : [a]
که a
متغیر بود، و در سطح جملهای به انواع مقادیر اعمال و مثلاً به تایپِ [Char]
یا [Integer]
(یا هر لیست دیگهای – واضحه که انواع لیستها خیلی زیادن) تبدیل میشد.