رازها

رازها

تمرین یادگیری

مقدمه

توابع بی‌نام

Gleam «توابع درجه‌اول» دارد؛ یعنی توابع مقادیر معمولی‌اند که می‌توان آن‌ها را به متغیرها اختصاص داد، به‌عنوان آرگومان پاس داد و از توابع دیگر برگرداند.

می‌توان به تابعی که در یک ماژول تعریف شده و اسم دارد، با اسمش ارجاع داد.

pub fn main() {
  // Assign the function to a variable
  let f = add_one
  
  // Invoke the function
  f(1) // -> 2
  f(2) // -> 3
}

fn add_one(x) {
  x + 1
}

Gleam همچنین توابع بی‌نام دارد که درون توابع دیگر تعریف می‌شوند.

// Define the function
let f = fn(x) { x + 1 }

// Invoke the function
f(1) // -> 2
f(2) // -> 3

نوع یک تابع با نحوه‌ی نگارشی مشابه توابع بی‌نام نوشته می‌شود. نوع تابعی که یک Int و یک Float می‌گیرد و یک Int برمی‌گرداند، به این شکل نوشته می‌شود:

fn(Int, Float) -> Int

توابع بی‌نام می‌توانند به متغیرهایی ارجاع دهند که هنگام تعریف آن‌ها در محدوده بودند و همین آن‌ها را به «بستار» تبدیل می‌کند.

let secret_number = 42

// This function always returns 42
fn() { secret_number }

نحوه‌ی نگارش «گرفتن تابع» شکل کوتاه مناسبی برای ساختن توابع بی‌نامی فراهم می‌کند که یک آرگومان را به یک تابع پاس می‌دهند. این دو عبارت معادل هستند:

// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }

// Function capture syntax
let f = my_function(1, 2, _)

دستورالعمل‌ها

در این تمرین، مأمور شده‌اید نرم‌افزار یک دستگاه رمزنگاری را بنویسید که با انجام تبدیل‌هایی روی داده‌ها کار می‌کند. به روشی نیاز دارید که با آن بتوانید به‌شکلی انعطاف‌پذیر، توابع پیچیده را با ترکیب توابع ساده‌تر بسازید.

برای هر کار، یک «تابع بی‌نام» برگردانید که بتوان آن را از «محدوده‌ی فراخوانی» فراخوانی کرد.

1. ساخت تابع جمع

secret_add را پیاده‌سازی کنید. باید تابعی را برگرداند که یک آرگومان می‌گیرد و آرگومانی را که به secret_add داده شده، به آن اضافه می‌کند.

let adder = secret_add(2)
adder(2)
// -> 4

2. ساخت تابع تفریق

secret_subtract را پیاده‌سازی کنید. باید تابعی را برگرداند که یک آرگومان می‌گیرد و مقدار مخفی داده‌شده به secret_subtract را از آن آرگومان کم می‌کند.

let subtractor = secret_subtract(2)
subtractor(3)
// -> 1

3. ساخت تابع ضرب

secret_multiply را پیاده‌سازی کنید. باید تابعی را برگرداند که یک آرگومان می‌گیرد و آن را در مقدار مخفی داده‌شده به secret_multiply ضرب می‌کند.

let multiplier = secret_multiply(7)
multiplier(3)
// -> 21

4. ساخت تابع تقسیم

secret_divide را پیاده‌سازی کنید. باید تابعی را برگرداند که یک آرگومان می‌گیرد و آن را بر مقدار مخفی داده‌شده به secret_divide تقسیم می‌کند.

let divider = secret_divide(3)
divider(32)
// -> 10

5. ساخت تابع ترکیب‌کننده

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

let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)

combined(6)
// -> 14
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Gleam Exercism

آماده‌اید رازها را شروع کنید؟

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.