비밀

비밀

학습 연습 문제

소개

익명 함수

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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.