수색…
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_left 및 List.fold_right 함수는 목록 집계의 외부 논리를 구현하는 고차 함수입니다. 목록을 집계하는 것은 때로는 목록을 축소하는 것으로도 불리우며 그 목록에있는 모든 항목을 순차적으로 검사하여 얻은 값을 계산하는 것을 의미합니다.
-
List.fold_left fa [b1; ...; bn]은f (... (f (fa b1) b2) ...) bn이다. -
List.fold_right f [a1; ...; an] b는f 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_left 와 List.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
이러한 예제는 학습 자료로 사용하기위한 것이며, 이러한 구현은 표준 라이브러리의 해당 기능에 대한 미덕이 없습니다.