زبان برنامه نویسی ارلنگ - تاپل (Tuple) یا چند‌تایی

تاپل (Tuple) یا چند‌تایی

چند‌تایی روشی برای ساز‌ماندهی داده‌هاست. روشی‌است برای دسته بندی Term ها وقتی که میدونید چند تا Term وجود داره. توی ارلنگ یک Tuple یا چندتایی به شکل {Element1, Element2, ..., ElementN} نوشته میشه. مثلا شما مشخصات یک نقطه (x,y) رو توی دستگاه دکارتی دارید. میتونیم این نقطه رو به شکل یک Tuple که دو تا Term داره نشون بدیم:

1> X = 10, Y = 4.
4
2> Point = { X , Y }.
{ 10 , 4 }
توجه توجه: به یک داده از هرنوعی Term گفته می‌شود.

توی این مورد یک نقطه همیشه از دو تا Term تشکیل میشه. به جای اینکه متغییرهای X و Y رو با خودمون حمل کنیم، یک متغییر Point رو حمل میکنیم. اگه یه ‌Point به ما رسیده باشه و ما فقط X رو نیاز داشته باشیم چه کنیم؟ استخراج کردن اطلاعاتی که میخواهیم سخت نیست. اگه یادتون باشه وقتی ما مقادیر رو منتسب میکنیم در صورتی ارلنگ شاکی نمیشه که مقادیر همون‌ها باشه که قبلا بوده. بزارین ازش سوءاستفاده کنیم! ممکنه نیاز داشته باشین متغییر ها رو با ()f پاک کنین.

3> Point = { 4 , 5 }.
{ 4 , 5 }
4> { X , Y } = Point.
{ 4 , 5 }
5> X.
4
6> { X , _ } = Point.
{ 4 , 5 }

اول اینکه: X و Y هیچ مقداری ندارند، پس به عنوان متغییرهای مقید نشده (Unbound variable) در نظر گرفته می‌شن. وقتی ما اونا رو توی چند‌تایی {X , Y} و سمت چپ عملگر = قرار میدیم، عملگر = دو مقدار { 5 , 4 } و { X , Y } رو با هم مقایسه می‌کنه. ارلنگ به اندازه کافی هوشمند هست که دو مقدار داخل چندتایی رو توی متغییرهای X و Y در سمت چپ عملگر = قرار بده. بعد حالا فقط {4,5} = {4,5} رو با هم مقایسه می‌کنه و مشخصه که مقایسه به درستی انجام می‌شه! و این یکی از شکل‌های تطبیق الگو (pattern matching) است. نکته اینکه توی عبارت ۶ از متغییر بی‌نام _ استفاده شده. این دقیقا معنی شه: بی‌خیال شو از مقداری که معمولا اینجا قرار‌ می‌گیره؛ چون ما ازش استفاده نمی‌کنیم. متغییر _ همیشه به عنوان یک متغییر Unbound در نظر گرفته میشه و ما ازش به عنوان یه Wildcard توی تطبیق الگو استفاده می‌کنیم.

توجه توجه: تطبیق الگو فقط در صورتی برای استخراج مقادیر یک چندتایی کار‌ می‌کنه که تعداد عناصر چندتایی (طول چند‌تایی) یکی باشه.
7> { _ , _ } = { 4 , 5 }.
{ 4 , 5 } 
8> { _ , _ } = { 4 , 5 , 6 }.
** exception error: no match of right hand side value {4,5,6}

چندتایی ها همچنین برای وقتی که ما با یک مقدار کار می‌کنیم هم مفیده. چه‌جوری؟ اینجوری! ساده‌ترین نمونه برای دمای محیط است:

9> Temperature = 23.213.
23.213

خب،این دما برای رفتن به استخر عالیه... صبر کنین، این دما واحدش چیه، کلوین، سلسیوس یا فارنهایت؟‍‍

10> PreciseTemperature = { celsius , 23.213 }.
{ celsius , 23.213 }
11> { kelvin , T} = PreciseTemperature.
** exception error: no match of right hand side value { celsius , 23.213 }

این باعث یک خطا میشه، ولی این دقیقا همون چیزیه که ما می‌خواستیم. توجه: این همون تطبیق الگو است. عملگر = ، {kelvin, T} و {celsius, 23.213} رو با هم مقایسه می‌کنه؛ حتی اگر متغیر T مقید نشده (Unbound) باشه، ارلنگ می‌بینه اتم celsius با اتم kelvin در مقایسه یکی نیست. یک استثنا (exception) پرتاب می‌شه و باعث میشه اجرای کد متوقف بشه. اینجوری بخشی از برنامه ما که انتظار داره دما با واحد کلوین باشه، قادر نباشه دما با واحد سلسیوس رو پردازش کنه. این باعث میشه به سادگی برنامه‌نویس بدونه چه چیزی مورد مقایسه قرار گرفته و همچنین توی خطایابی بهش کمک می‌کنه. یک چندتایی که عنصر اولش یک اتم باشه به اون tagged tuple میگن. هر عنصر چند تایی می‌تونه از هر نوعی باشه حتی یه چندتایی دیگه:

12> {point , { X , Y} }.
{ point , {4 , 5} }

اگه بخواهیم چند تا نقطه رو حمل کنیم چه‌کار کنیم؟ در قسمت بعدی به اون می‌پردازیم.