수색…
통사론
-
val (|>) : 'a -> ('a -> 'b) -> 'b -
val (@@) : ('a -> 'b) -> 'a -> 'b
일반 알고리즘
고차 함수는 일반 알고리즘을 구현하는 데 사용할 수 있으므로 최종 세부 정보를 사용자에게 제공하는 책임을 포기합니다. 예를 들어, List.sort 는 다양한 정렬 방법을 구현할 수있는 비교 함수를 필요로합니다. 다음은 대소 문자를 구분하지 않는 문자열 정렬을 구현 한 것입니다.
let string_case_insensitive_sort lst =
let case_insensitive_compare a b =
String.compare (String.lowercase a) (String.lowercase b)
in
List.sort case_insensitive_compare lst
표준 라이브러리, 특히 List 모듈의 고차 함수 목록이 풍부합니다 ( List.fold_left 및 List.sort 참조). 더 많은 고급 예제는 타사 라이브러리에서 찾을 수 있습니다. 좋은 예가 ocaml-gsl 에서 구현 된 시뮬레이션 어닐링 입니다. 시뮬레이션 어닐링 은 문제의 상태 집합과 오류 함수 (여기서는 에너지 함수라고 함)를 탐색하는 데 사용되는 함수로 매개 변수화 된 일반적인 최적화 절차입니다.
C ++에 익숙한 사용자는이를 전략 패턴과 비교할 수 있습니다.
예외가 발생하는 경우에도 시스템 리소스를 삭제합니다.
처리가 예외를 발생시키는 경우에도 고차 함수를 사용하여 시스템 자원이 폐기되도록 할 수 있습니다. with_output_file 의해 사용되는 패턴은 걱정을 with_output_file 분리 할 수있게 해줍니다. higher-order with_output_file 함수는 파일 조작에 바인딩 된 시스템 자원을 관리하며 치료 f 는 출력 채널 만 사용합니다.
let with_output_file path f =
let c = open_out path in
try
let answer = f c in
(close_out c; answer)
with exn -> (close_out c; raise exn)
이 higher-order 함수를 사용하여 파일에 문자열을 쓰는 함수를 구현해 보겠습니다.
let save_string path s =
(with_output_file path) (fun c -> output_string c s)
fun c -> output_string cs 보다 더 고급 함수를 사용하면 더 복잡한 값을 저장할 수 있습니다. 표준 라이브러리의 마샬 모듈이나 Martin Jambon의 Yojson 라이브러리를 참조하십시오.
합성 연산자
두 가지 유용한 고차 함수는 이진 응용 프로그램 ( @@ )과 역방향 응용 프로그램 또는 "파이프"( |> ) 연산자입니다. 4.01 부터는 프리미티브로 사용할 수 있지만 여전히 여기에 정의하는 것이 유익 할 것입니다.
let (|>) x f = f x
let (@@) f x = f x
3의 제곱을 증가시키는 문제를 고려하십시오. 계산을 표현하는 한 가지 방법은 다음과 같습니다.
(* 1 -- Using parentheses *)
succ (square 3)
(* - : int = 10 *)
(* where `square` is defined as: *)
let square x = x * x
succ square 3 (succ square) 3 줄이기 때문에 ( left-associativity 로 인해) 우리는 단지 succ square 3 을 할 수 없다. 응용 프로그램 ( @@ )을 사용하여 괄호없이 표현할 수 있습니다.
(* 2 -- Using the application operator *)
succ @@ square 3
(* - : int = 10 *)
수행 할 마지막 작업 (즉 succ )이 표현식에서 처음으로 어떻게 발생하는지 주목하십시오. reverse-application 연산자 ( |> )를 사용하면 이것을 역으로 처리 할 수 있습니다.
(* 3 -- Using the reverse-application operator *)
3 |> square |> succ
(* - : int = 10 *)
숫자 3은 이제 square 통과 한 후 succ 를 적용하여 square 에 적용하여 succ 가 적용된 결과를 succ 습니다.