۱۱ - ۷آریتی دادهسازها
حالا که درک خوبی از ساختار و آناتومیِ نوعدادهها پیدا کردیم، میخوایم نشون بدیم که چرا به اونها میگیم جبری. اول با توضیحِ آریتی شروع میکنیم. آریتی تعداد آرگومانهاییه که یه تابع یا سازنده میگیره. به تابعی که هیچ آرگومانی نمیگیره میگیم پوچگانه، که از دو بخشِ 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
داشته باشه.