수색…


통사론

  • 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) 는 매우 추상적 인 고차원 함수의 시스템의 예입니다.

지도 작성, 필터링 및 축소

표준 라이브러리에 포함 된 가장 근본적인 고차원 함수 중 두 가지는 mapfilter 입니다. 이러한 함수는 일반적이며 반복 가능한 모든 함수에서 작동 할 수 있습니다. 특히 배열 에 대한 계산에 적합 합니다 .

우리가 학교의 데이터 세트를 가지고 있다고 가정 해 봅시다. 각 학교는 특정 과목을 가르치고, 수업 수와 수업 당 평균 학생 수를 가지고 있습니다. 우리는 다음과 같은 불변 유형 의 학교를 모델링 할 수 있습니다.

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+ 와 같은 연관 연산에 대해서만 의미가 있지만 때때로 비 연관 연산으로 축소를 수행하는 것이 유용합니다. 고차 함수 foldlfoldr 은 특정 축소 순서를 강제하기 위해 제공됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow