۱۱ - ۷آریتی داده‌سازها

حالا که درک خوبی از ساختار و آناتومیِ نوع‌داده‌ها پیدا کردیم، می‌خوایم نشون بدیم که چرا به اونها میگیم جبری. اول با توضیحِ آریتی شروع می‌کنیم. آریتی تعداد آرگومان‌هاییه که یه تابع یا سازنده می‌گیره. به تابعی که هیچ آرگومانی نمی‌گیره میگیم پوچگانه، که از دو بخشِ null و ‏‎-ary‎‏ درست شده. null به معنای صفر یا پوچ، و پسوندِ ‏‎-ary‎‏ تعلق داشتن یا متعلق بودن رو نشون میده. این پسوند در ریاضیات برای آریتی زیاد به کار میره، مثلِ پوچگانه، یگانی، دوگانه، و مشابه اینها.

به داده‌سازهایی هم که هیچ آرگومانی نمی‌گیرن پوچگانه میگیم. داده‌سازهای پوچگانه مثلِ ‏‎True‎‏ و ‏‎False‎‏، مقادیرِ ثابت در سطح جمله‌ای اند، و از اونجا که آرگومانی نمی‌گیرن، نمی‌تونن هیچ داده ای غیر از خودشون درست کنن. مقادیری‌اند که مستقلاً وجود دارن و نقشِ شاهد رو برای نوع‌داده ای که دَرِش تعریف شدن ایفا می‌کنن.

گفتیم یه تایپ رو میشه شمارشی از سازنده‌ها که صفرتا یا بیشتر آرگومان دارن تعریف کرد. حالا سازنده‌هایی که آرگومان می‌گیرن رو بررسی می‌کنیم.

دیدیم داده‌سازهایی که آرگومان می‌گیرن، شبیهِ توابع عمل می‌کنن، چون قبل از اینکه مقداری بِدَن، باید به یه چیزی اعمال بِشَن. داده‌سازهایی که یک آرگومان می‌گیرن رو میگیم یگانی. و همونطور که جلوتر می‌بینیم، به داده‌سازهایی که بیشتر از یک آرگومان می‌گیرن، میگیم ضرب.

همه‌ی مثال‌های زیر، تعاریفِ داده‌ی صحیحی هستن:

-- پوچگانه
data Example0 =
  Example0
  deriving (Eq, Show)

-- یگانی
data Example1 =
  Example1 Int
  deriving (Eq, Show) 

-- String و Int ضرب
data Example2 =
  Example2 Int String
  deriving (Eq, Show)

Prelude> Example0
Example0
Prelude> Example1 10
Example1 10
Prelude> Example1 10 = Example1 42
False
Prelude> let nc = Example2 1 "NC"
Prelude> Example2 10 "FlappityBat" == nc
False

مثالِ ‏‎Example2‎‏ یه ضرب ِه، مثلِ توپل که قبلاً دیدیم. بسته به تعداد جایی که یه نوع توپل داره، توپل‌ها می‌تونن آرگومان‌های زیادی بگیرن. توپل کلاً به عنوانِ تایپِ ضرب ِ متعارف (م. یا کانونیک) شناخته میشه؛ در واقع چون انواعِ تایپ‌هاش اسمی ندارن، ضرب‌های بی‌نام به حساب میان. جلوتر به تایپ‌های ضرب می‌رسیم.

داده‌سازهای یگانی (یک آرگومانی) یک مقدار از هر تایپی که آرگومان‌شون بوده رو شامل میشن. مثالِ زیر یه تعریفِ داده هست که داده‌ساز ِ ‏‎MyVal‎‏ رو داره. ‏‎MyVal‎‏ یه آرگومانِ ‏‎Int‎‏ میگیره و یه تایپ به اسمِ ‏‎MyType‎‏ درست می‌کنه:

data MyType = MyVal Int
--   [1]      [2]   [3]
     deriving (Eq, Show)
--     [4]      [5]

۱.

نوع‌ساز.

۲.

داده‌ساز. ‏‎MyVal‎‏ یه آرگومانِ تایپی می‌گیره، پس به همین خاطر بهش میگیم داده‌ساز ِ یگانی.

۳.

آرگومانِ تایپی برای تعریفِ داده‌ساز ِ ‏‎[2]‎‏.

۴.

عبارتِ مشتق‌گیری.

۵.

نمونه‌های تایپکلاسی که مشتق گرفته میشن. اینجا نمونه‌های ‏‎Eq‎‏ و ‏‎Show‎‏ رو برای بررسیِ تساوی و تبدیلِ مقادیر به نوشته مجانی گرفتیم.

Prelude> :t MyVal
MyVal :: Int -> MyType
Prelude> MyVal 10
MyVal 10
Prelude> MyVal 10 == MyVal 10
True
Prelude> MyVal 10 == MyVal 9
False

به این دلیل که ‏‎MyVal‎‏ یک آرگومانِ ‏‎Int‎‏ داره، یه مقدار با تایپِ ‏‎MyType‎‏ هم باید یک – و فقط یک – مقدارِ ‏‎Int‎‏ داشته باشه.