توابع بی‌نام و درجه‌بالا در جولیا

توابع arrow (->)، map، filter و reduce — سبک تابعی جولیا

تابع بی‌نام چیست؟

تابع بی‌نام (Anonymous Function) تابعی بدون نام است — برای استفاده یک‌باره. در جولیا با -> (فلش):

# ساختار: آرگومان -> بدنه
double = x -> 2x

println(double(5))   # 10

# چند آرگومان
add = (a, b) -> a + b
println(add(3, 4))   # 7

map — اعمال تابع روی کالکشن

nums = [1, 2, 3, 4, 5]

# با تابع بی‌نام
squares = map(x -> x^2, nums)
println(squares)   # [1, 4, 9, 16, 25]

# با تابع موجود
println(map(sqrt, [4, 9, 16]))   # [2.0, 3.0, 4.0]

# روی دو آرایه
println(map((a, b) -> a + b, [1, 2, 3], [10, 20, 30]))   # [11, 22, 33]

filter — فیلتر کردن

nums = 1:10

# فقط زوج‌ها
evens = filter(x -> x % 2 == 0, nums)
println(evens)   # [2, 4, 6, 8, 10]

# فقط مثبت‌ها
mixed = [-3, 5, -1, 8, 0, -7]
positives = filter(x -> x > 0, mixed)
println(positives)   # [5, 8]

reduce — کاهش به یک مقدار

nums = [1, 2, 3, 4, 5]

# جمع همه
total = reduce(+, nums)
println(total)   # 15

# با عملگر دلخواه
product = reduce(*, nums)
println(product)   # 120

# با تابع
maxVal = reduce(max, nums)
println(maxVal)   # 5

ترکیب طلایی: map + filter + reduce

nums = 1:20

# مجموع مربع‌های زوج‌ها
result = nums |> filter(x -> x % 2 == 0) |> map(x -> x^2) |> sum
println(result)   # 2²+4²+...+20² = 2870
عملگر |> (pipe) خروجی را به تابع بعدی می‌دهد — مثل لوله‌کشی! این سبک در جولیا خیلی رایج است.

do — شکل خوانا‌تر

# به‌جای تابع بی‌نام داخل آرگومان:
result = map(nums) do x
    if x > 10
        x * 100
    else
        x
    end
end

توابع درجه‌بالا

توابعی که توابع می‌گیرند یا برمی‌گردانند:

# سازنده تابع
function makeMultiplier(n)
    return x -> x * n
end

double = makeMultiplier(2)
triple = makeMultiplier(3)

println(double(10))   # 20
println(triple(10))   # 30

مثال عملی: پردازش داده

students = [
    ("علی", 18),
    ("مریم", 20),
    ("رضا", 12),
    ("سارا", 16),
]

-- فقط قبول‌شده‌ها (نمره >= 15)
passed = filter(s -> s[2] >= 15, students)
println(passed)

-- نام‌های قبولی
names = map(s -> s[1], passed)
println(names)

-- میانگین کل
avg = map(s -> s[2], students) |> sum |> x -> x / length(students)
println("میانگین: ", avg)

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط