نوع Bool که «منطقی» نامیده میشود (و گاهی «بولی»)، یکی از بلوکهای سازندهی زبان است. هدفش توصیف این است که یک عبارت درست است یا غلط، و این کار را با دو مقدار متناظر True و False انجام میدهد.
مقدارهای منطقی را میتوان با عملگرهای && («AND») و || («OR») ترکیب کرد و با تابع not نقیضشان کرد.
مقدارهای منطقی همچنین برای ساختن شاخههایی در کد بسیار به کار میآیند؛ شاخههایی که فقط وقتی اجرا میشوند که شرطهای مشخصی برقرار باشند. در Elm این کار با یک عبارت if-then-else انجام میشود که به شکل زیر به کار میرود.
if someCondition || (someOtherCondition && anotherCondition) then
doSomething
else
doSomethingElse
در این تمرین، منطق ماجراجویی یک بازی نقشآفرینی تازه را پیادهسازی میکنید که یکی از دوستانتان در حال ساخت آن است. شخصیت اصلی بازی آنالین است، دختری شجاع با یک سگ خانگی خشن و وفادار. متأسفانه فاجعه رخ میدهد، چون بهترین دوستش هنگام جستوجوی توت در جنگل ربوده شد. آنالین تلاش میکند بهترین دوستش را پیدا کند و آزادش کند، و میتواند سگش را نیز بهطور اختیاری در این ماجراجویی با خود ببرد.
پس از مدتی که رد بهترین دوستش را دنبال میکند، اردوگاهی را مییابد که بهترین دوستش در آن زندانی است. معلوم میشود دو آدمربا وجود دارد: یک شوالیهی نیرومند و یک کماندار حیلهگر.
حالا که آدمرباها را یافته است، آنالین بررسی میکند که میتواند کدامیک از کارهای زیر را انجام دهد:
شما پنج وظیفه دارید: پیادهسازی منطق تعیین اینکه کارهای بالا بر اساس وضعیت سه شخصیت موجود در جنگل و اینکه سگ خانگی آنالین حاضر است یا نه، در دسترس هستند یا نه.
تابع canFastAttack را پیادهسازی کنید که یک «مقدار منطقی» میگیرد و نشان میدهد آیا شوالیه بیدار است یا نه. این تابع اگر بر اساس وضعیت شوالیه بتوان حملهی سریع انجام داد، True برمیگرداند. در غیر این صورت، False برمیگرداند:
knightIsAwake = True
canFastAttack knightIsAwake
--> False
تابع canSpy را پیادهسازی کنید که سه مقدار منطقی میگیرد و به ترتیب نشان میدهد آیا شوالیه، کماندار و زندانی بیدار هستند یا نه. این تابع اگر بر اساس وضعیت این سه شخصیت بتوان از گروه جاسوسی کرد، True برمیگرداند. در غیر این صورت، False برمیگرداند:
knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
canSpy knightIsAwake archerIsAwake prisonerIsAwake
--> True
تابع canSignalPrisoner را پیادهسازی کنید که دو مقدار منطقی میگیرد و به ترتیب نشان میدهد آیا کماندار و زندانی بیدار هستند یا نه. این تابع اگر بر اساس وضعیت این دو شخصیت بتوان به زندانی علامت داد، True برمیگرداند. در غیر این صورت، False برمیگرداند:
archerIsAwake = False
prisonerIsAwake = True
canSignalPrisoner archerIsAwake prisonerIsAwake
--> True
تابع canFreePrisoner را پیادهسازی کنید که چهار مقدار منطقی میگیرد. سه پارامتر اول به ترتیب نشان میدهند آیا شوالیه، کماندار و زندانی بیدار هستند یا نه. پارامتر آخر نشان میدهد آیا سگ خانگی آنالین حاضر است یا نه. این تابع اگر بر اساس وضعیت این سه شخصیت و حضور سگ خانگی آنالین بتوان زندانی را آزاد کرد، True برمیگرداند. در غیر این صورت، False برمیگرداند:
knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False
canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
--> False
تابع stealthAttackDamage را پیادهسازی کنید که یک مقدار منطقی میگیرد و نشان میدهد آیا آنالین شناسایی شده است یا نه. این تابع اگر شناسایی شده باشد ۷ و در غیر این صورت ۱۲ برمیگرداند.
annalynIsDetected = True
stealthAttackDamage annalynIsDetected
--> 7