수색…


통사론

  • 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_leftList.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 습니다.



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