۹ - ۱۳تعاریف

۱.

در نظریه‌ی نوع‌ها، تایپ ضرب یا product type، تایپی‌ه که از یک مجموعه از تایپ‌ها که روی هم آمیخته میشن درست میشه. تایپ‌های ضرب در هسکل، با توپل یا داده‌سازهایی که بیشتر از یک آرگومان می‌گیرن ارائه میشن. این "آمیزش" از همه‌ی آرگومان‌هایِ تایپی روی داده‌ساز انجام میشه، و این داده‌ساز خودش معرفِ یک مقداره که در کنار همه‌ی مقادیر دیگه همزیستی می‌کنه. ضرب ِ تایپ‌ها معادلِ عطف ِ منطقی (و) بین اون تایپ‌هاست. اگه یه ضرب از ‏‎Bool‎‏ و ‏‎Int‎‏ داشته باشین، هر جمله‌ای از اون تایپِ ضرب، هم ‏‎Bool‎‏ و هم ‏‎Int‎‏ داره.

۲.

در نظریه‌ی نوع‌ها، تایپ جمع یا sum type از دو تایپ، تایپی‌ه که جملات‌ش، جملاتِ یکی از دو تایپ‌ه؛ نه همزمان هر دو. در هسکل، تایپ‌های جمع با خط عمودی ‏‎|‎‏ در تعریفِ نوع‌داده ارائه میشن. جمعِ تایپ‌ها معادلِ فصل ِ منطقی (یا) بین اون تایپ‌هاست. اگه یه جمع از ‏‎Bool‎‏ و ‏‎Int‎‏ داشته باشین، هر جمله‌ای از اون تایپِ جمع، یا یه مقدارِ ‏‎Bool‎‏ هست، یا یه مقدارِ ‏‎Int‎‏.

۳.

از cons (م. کانز) معمولاً به عنوانِ فعل، و برای نشون دادنِ این که یه مقدار با تایپ لیست، از cons کردنِ یک مقدار به ابتدای یه لیست دیگه درست شده به کار میره. در هسکل، ‏‎(:)‎‏ اوپراتورِ cons برای تایپِ لیست‌ه. یک داده‌ساز ِه که در نوع‌داده ِ لیست تعریف شده:

    1 : [2, 3]
-- [a]    [b]

 [1, 2, 3] 
--  [c]

  (:) :: a -> [a] -> [a]
--      [d]   [e]    [f]

a)

عدد ۱، مقداری که داریم cons می‌کنیم.

b)

یه لیست از عدد ۲ و به دنبال‌ش عدد ۳.

c)

نتیجه‌ی نهایی از cons کردنِ ۱ به ‏‎[2,3]‎‏.

d)

متغیرِ تایپی ِ ‏‎a‎‏ مربوط به ۱ میشه. همون مقداری که به لیست cons کردیم.

e)

اولین تایپِ ‏‎[a]‎‏ که در تایپ سیگنچر ِ اوپراتورِ cons هست، دومین و آخرین آرگومانی‌ه که ‏‎(:)‎‏ قبول می‌کنه، که اینجا ‏‎[2,3]‎‏ بود.

f)

دومین و آخرین باری که تایپِ ‏‎[a]‎‏ در تایپ سیگنچر ِ اوپراتورِ cons ظاهر میشه، به نتیجه‌ی نهایی اشاره داره، ‏‎[1,2,3]‎‏.

۴.

سلول cons یا cons cell یک داده‌ساز و ضرب از تایپ‌های ‏‎a‎‏ و ‏‎[a]‎‏ هست که در نوع‌داده ِ لیست تعریف شده. این داده‌ساز در آرگومانِ دوم‌ش به خودِ نوع‌ساز ِ لیست ارجاع میده، و به خاطرِ همین بازگشتی بودن، امکان تودرتو کردنِ چند سلول cons (که ممکنه تا بینهایت هم برن) فراهم میشه.

data [] a = [] | a : [a]
--                 ^ cons اوپراتور

-- خودمون تعریف کنیم

data List a = Nil | Cons a (List a)

-- با این تایپ اینطوری لیست می‌سازیم

Cons 1 (Cons 2 (Cons 3 Nil))

اینجا ‏‎(Cons 1 ...)‎‏، ‏‎(Cons 2 ...)‎‏، و ‏‎(Cons 3 Nil)‎‏ هر کدوم یک سلول cons در لیستِ ‏‎[1,2,3]‎‏ هستن.

۵.

ستون یا spine به ساختاری میگیم که یه مجموعه از مقادیر رو به هم می‌چسبونه. در نوع‌داده ِ لیست، ستون با تودرتو شدنِ سلول‌‌های cons شکل می‌گیره. در واقع ستون، ساختارِ مجموعه‌ست که مقادیرِ داخل‌ش نیست. معمولاً از ستون برای اشاره به لیست‌ها استفاده میشه، اما برای ساختارهای داده‌ی درختی هم به کار میره.

1 : --------| cons اینجا اوپراتورهای
  (2 : -----| تودرتو، ستون رو نشون میدن.
     (3 : --|
         []))

-- حذف مقادیر بی‌ربط

_ : ----------|
  (_ : -------|
     (_ : ----> ستون
         []))