Julia Language
고차 함수
수색…
통사론
- foreach (f, xs)
- 지도 (f, xs)
- 필터 (f, xs)
- reduce (f, v0, xs)
- foldl (f, v0, xs)
- foldr (f, v0, xs)
비고
함수는 매개 변수로 받아 들일 수 있으며 리턴 유형으로도 생성 될 수 있습니다. 실제로 함수는 다른 함수의 본문 내부에서 생성 될 수 있습니다. 이러한 내부 함수를 클로저라고 합니다.
인수로서의 기능
함수 는 Julia의 객체입니다. 다른 모든 개체와 마찬가지로 다른 함수에 인수로 전달 될 수 있습니다. 함수를 받아들이는 함수를 고차 함수라고합니다.
예를 들어 함수 f
를 첫 번째 매개 변수로 사용하여 표준 라이브러리의 foreach
함수를 구현할 수 있습니다.
function myforeach(f, xs)
for x in xs
f(x)
end
end
이 함수가 실제로 예상대로 작동하는지 테스트 할 수 있습니다.
julia> myforeach(println, ["a", "b", "c"])
a
b
c
함수를 첫 번째 매개 변수로 사용하면 이후 매개 변수 대신 Julia의 do 블록 구문을 사용할 수 있습니다. do 블록 구문은 익명 함수 를 함수 의 첫 번째 인수로 전달하는 편리한 방법 일뿐입니다.
julia> myforeach([1, 2, 3]) do x
println(x^x)
end
1
4
27
위의 myforeach
구현은 내장 된 foreach
함수와 거의 같습니다. 다른 많은 내장 된 고차 함수도 존재합니다.
고차 함수는 매우 강력합니다. 때로는 고차 함수로 작업 할 때 수행되는 정확한 연산이 중요하지 않게되고 프로그램이 매우 추상적이 될 수 있습니다. 결합 자 (Combinator) 는 매우 추상적 인 고차원 함수의 시스템의 예입니다.
지도 작성, 필터링 및 축소
표준 라이브러리에 포함 된 가장 근본적인 고차원 함수 중 두 가지는 map
과 filter
입니다. 이러한 함수는 일반적이며 반복 가능한 모든 함수에서 작동 할 수 있습니다. 특히 배열 에 대한 계산에 적합 합니다 .
우리가 학교의 데이터 세트를 가지고 있다고 가정 해 봅시다. 각 학교는 특정 과목을 가르치고, 수업 수와 수업 당 평균 학생 수를 가지고 있습니다. 우리는 다음과 같은 불변 유형 의 학교를 모델링 할 수 있습니다.
immutable School
subject::Symbol
nclasses::Int
nstudents::Int # average no. of students per class
end
우리 학교의 데이터 세트는 Vector{School}
가 될 것입니다 :
dataset = [School(:math, 3, 30), School(:math, 5, 20), School(:science, 10, 5)]
우리가 수학 프로그램에 등록한 전체 학생의 수를 찾고 싶다고합시다. 이렇게하려면 몇 가지 단계가 필요합니다.
- 우리는 데이터 집합을 수학을 가르치는 학교 (
filter
)로 좁혀 야합니다. - 각 학교 (
map
)의 학생 수를 계산해야합니다. - 우리는 학생 수의 목록을 단일 값으로
reduce
합니다. 합계 (reduce
)
순진한 (성능이 가장 좋지 않은) 솔루션은 단순히 세 가지 고차 함수를 직접 사용하는 것입니다.
function nmath(data)
maths = filter(x -> x.subject === :math, data)
students = map(x -> x.nclasses * x.nstudents, maths)
reduce(+, 0, students)
end
우리는 우리의 데이터 세트에 190 명의 수학 학생이 있음을 확인합니다.
julia> nmath(dataset)
190
이러한 기능을 결합하여 성능을 향상시키는 기능이 있습니다. 예를 들어 mapreduce
함수를 사용하여 한 단계로 매핑 및 축소를 수행하면 시간과 메모리를 절약 할 수있었습니다.
reduce
는 +
와 같은 연관 연산에 대해서만 의미가 있지만 때때로 비 연관 연산으로 축소를 수행하는 것이 유용합니다. 고차 함수 foldl
및 foldr
은 특정 축소 순서를 강제하기 위해 제공됩니다.