수색…


List.Map

List.map 은 영어로 함수를 취하는 함수 (우리는이 함수를 매핑 함수라고 부름)를 하나의 유형 (즉, 'a ('a -> 'b) -> 'a list -> 'b list 'a ) 다른 유형 (즉 'b )과 첫 번째 유형의 목록. 이 함수는 모든 요소가 첫 번째 목록의 요소에서 매핑 함수를 호출 한 결과 인 두 번째 형식의 목록을 반환합니다.

List.map string_of_int [ 1; 2; 3; 4 ]
#- [ "1"; "2"; "3"; "4" ] : string list

'a'b 'a 유형은 다를 필요는 없습니다. 예를 들어 숫자를 쉽게 사각형에 매핑 할 수 있습니다.

let square x = x * x in
List.map square [ 1; 2; 3; 4 ]
#- [ 1; 4; 9; 16 ] : int list

목록의 데이터 집계

List.fold_leftList.fold_right 함수는 목록 집계의 외부 논리를 구현하는 고차 함수입니다. 목록을 집계하는 것은 때로는 목록을 축소하는 것으로도 불리우며 그 목록에있는 모든 항목을 순차적으로 검사하여 얻은 값을 계산하는 것을 의미합니다.

List 모듈문서에는

  • List.fold_left fa [b1; ...; bn]f (... (f (fa b1) b2) ...) bn 이다.
  • List.fold_right f [a1; ...; an] bf a1 (f a2 (... (f an b) ...)) 입니다. (후자의 함수는 tail-recursive가 아닙니다.)

일반 영어 컴퓨팅 List.fold_left fa [b1; ...; bn] 은 목록 [b1; ...; bn] 은 초기에 a 설정된 누적 기의 트랙을 유지 a : 목록의 항목을 볼 때마다 f 를 사용하여 누적 기의 값을 업데이트하고, 완료되면 누산기가 계산의 최종 값이다. List.fold_right 함수도 비슷합니다.

다음은 몇 가지 실제적인 예입니다.

숫자 목록의 총 합계 계산

List.fold_left ( + ) 0 lst

수레 목록의 평균 계산

let average lst =
  let (sum, n) =
    List.fold_left (fun (sum, n) x -> (sum +. x, n + 1)) (0.0, 0) lst
  in
  sum /. (float_of_int n)

기본 목록 처리 다시 구현

List.fold_leftList.fold_right 함수는 너무 일반적이어서리스트 모듈의 거의 모든 다른 함수를 구현할 수 있습니다 :

let list_length lst = (* Alternative implementation to List.length *)
  List.fold_left ( + ) 0 lst

let list_filter predicate lst = (* Alternative implementation to List.filter *)
  List.fold_right (fun a b -> if predicate a then a :: b else b) lst []

이는 다시 구현하는 것도 가능하다 List.iter 함수를 기억하는 () 에서 응집 다른 예로서이 코드를 해석하는 프로그램의 글로벌 상태 :

let list_iter f lst = (* Alternation implementation to List.iter *)
  List.fold_left (fun () b -> f b) () lst

이러한 예제는 학습 자료로 사용하기위한 것이며, 이러한 구현은 표준 라이브러리의 해당 기능에 대한 미덕이 없습니다.



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