두 가지 질문이 관련되어 있습니다. 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 :: t
은 h
과 t
의 두 값을 취합니다. 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
는 명시 적 람다와 버전에 불과 편리 약어입니다. 다른 기능과 똑같습니다. 그것은 표기법의 선택 일뿐입니다.
그래서 어떻게 재미를 해석합니까 b -> a :: b? and fun h t -> fn h :: t) – patzi
답안을 업데이트 할 예정입니다. 주석에 여유가 없습니다. –
나는 이해한다고 생각한다. ocaml의 람다 식은 다른 함수의 특정 동작을 나타내는 함수입니다. – patzi