2017-11-03 25 views
2

문제점 : 첫 번째 인수가 단항 함수이고 두 번째 인수 목록이있는 함수 mapf을 정의하십시오. 결과는 인수 목록의 각 요소에 적용되는 함수 목록입니다. 재귀 함수가 아닌 fold_right를 사용하여 한면을 작성하십시오.fold_right의 메커니즘 이해

솔루션 :

let mapf fn list = fold_right (fun h t -> fn h :: t) list [] 

내가 fold_right 재귀 방식으로리스트 인수 함수를 계산하기 때문에 그 문제를 해결하는 방법을 이해하지 않는, 그래서 값이 아닌 목록을 반환합니다. 나는 다음 표기법이 무엇을 의미하는지 이해하지 못합니다.

fun h t -> fn h :: t 

답변

4

두 가지 질문이 관련되어 있습니다. fold_right이 값을 반환하지만 목록은 값입니다.

:: 연산자는 목록의 시작 부분에 새 요소를 추가합니다. 따라서이 응용 프로그램에 의해 계산 된 값인 fold_right은 실제로 목록입니다.

또 다른 방법은 다음과 같습니다. 당신이 + 연산자 fold_right를 사용하는 경우는 값과 같이 계산 :

fold_right (+) [1; 2; 3] 0 => 
1 + 2 + 3 + 0 => 
6 

당신이 :: 연산자 fold_right를 사용하는 경우,이 값과 같이 계산 :

fold_right (::) [1; 2; 3] [] => 
1 :: 2 :: 3 :: [] => 
[1; 2; 3] 

이 이론적 아니다 , 그것은 REPL 정확히 다음과 같이 작동

# List.fold_right (+) [1; 2; 3] 0;; 
- : int = 6 
# List.fold_right (fun a b -> a :: b) [1; 2; 3] [];; 
- : int list = [1; 2; 3] 

(당신은 fun a b -> a :: b를 작성해야 t 때문에 그는 :: 표기법을 독립 실행 형 기능으로 사용할 수는 없습니다. 불행하게도)는 자신을 :: 연산자를 사용하여 목록을 작성하는 완전히 합법적 있다는

참고 :.

먼저

# 1 :: 2 :: 3 :: [];; 
- : int list = [1; 2; 3] 

업데이트, fun x y -> expr은 OCaml의에서 "람다"에 대한 표기는, 즉, 함수 리터럴의 경우.

함수 fun h t -> fn h :: tht의 두 값을 취합니다. fn 함수를 h에 적용하고 t 앞에이 새 값을 가진 새 목록을 반환합니다. 타이핑 관점에서

, 값 h 올바른 유형 fn 전달할 수 있어야하고, fn 목록 t 판정 적합한 타입의 값을 반환한다.

fun h t -> (fn h) :: t과 같이 괄호로 묶어서 명확하게 볼 수 있습니다.

fun a b -> a :: b 기능은 a을 바로 b에 직접 붙이는 것을 제외하면 비슷합니다. 어떤 기능도 적용하지 않습니다.본질적으로, 이는 단지 :: 연산자가 수행하는 작업을 수행합니다.

입력 관점에서 a은 목록 b의 요소가되어야 올바른 유형이어야합니다.

업데이트 2

당신은 람다가 무엇인지 이해하려고 노력하는 경우, 그것을보고하는 방법 중 하나는 합리적으로 작고 함수를 작성 단지 편리한 방법이다. 당신은 쉽게 람다없이 주어진 코드를 작성할 수 있습니다 :

대신 람다의
let mapf fn list = 
    let helper h t = fn h :: t in 
    List.fold_right helper list [] 

,이 버전은 helper라는 이름의 로컬로 선언 된 기능이 있습니다.

또 다른 방법은 입니다. 기능은 람다입니다. 함수를 작성하는 관용적 방법 :

let f = fun x y -> x + y 

그래서, 정말, 람다 함수의 특별한 종류되지 않습니다 :

let f x y = x + y 

는 명시 적 람다와 버전에 불과 편리 약어입니다. 다른 기능과 똑같습니다. 그것은 표기법의 선택 일뿐입니다.

+0

그래서 어떻게 재미를 해석합니까 b -> a :: b? and fun h t -> fn h :: t) – patzi

+0

답안을 업데이트 할 예정입니다. 주석에 여유가 없습니다. –

+0

나는 이해한다고 생각한다. ocaml의 람다 식은 다른 함수의 특정 동작을 나타내는 함수입니다. – patzi