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, _)
이번 연습 문제에서는 데이터에 변환을 적용하는 방식으로 동작하는 암호화 장치의 소프트웨어를 작성해요. 더 단순한 함수들을 조합해서 복잡한 함수를 유연하게 만들 수 있는 방법이 필요해요.
각 과제마다, 호출하는 스코프에서 호출할 수 있는 익명 함수를 반환해야 해요.
secret_add를 구현해요. 인자 하나를 받아서, 그 인자에 secret_add에 전달된 값을 더하는 함수를 반환해야 해요.
let adder = secret_add(2)
adder(2)
// -> 4
secret_subtract를 구현해요. 인자 하나를 받아서, 그 인자에서 secret_subtract에 전달된 값을 빼는 함수를 반환해야 해요.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
secret_multiply를 구현해요. 인자 하나를 받아서, 그 인자에 secret_multiply에 전달된 값을 곱하는 함수를 반환해야 해요.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
secret_divide를 구현해요. 인자 하나를 받아서, 그 인자를 secret_divide에 전달된 값으로 나누는 함수를 반환해야 해요.
let divider = secret_divide(3)
divider(32)
// -> 10
secret_combine을 구현해요. 인자 하나를 받아서, secret_combine에 전달된 두 함수를 순서대로 그 인자에 적용하는 함수를 반환해야 해요.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.