2017-12-01 6 views
4

ocaml을 배우려고하는데 함수 작성 연산자 인 |>에 문제가 있습니다. Ocaml 함수 응용 연산자가 실패합니다.

utop # #require "core";; 
utop # open Core;; 
utop # Option.value_exn(Some(1));; 
- : int = 1 
utop # Some(1) |> Option.value_exn;; 
Error: This expression has type 
     ?here:Base__Source_code_position0.t -> 
     ?error:Base.Error.t -> ?message:string -> 'a option -> 'a 
     but an expression was expected of type int option -> 'b 

나는 x |> ff(x)에 해당 있어야했다 thoght. Option.value_exn(Some(1))은 작동하지만 Some(1) |> Option.value_exn은 작동하지 않는 이유는 무엇입니까?

+0

선택적 인자'? here'처럼 보이는데,'? error'와'? message'가 방해가되고 있습니다. 'Some (1) |> fun x -> Option.value_exn x ;;'를 시도해보십시오. – gallais

답변

3

유형의 어려움 유추 및 선택적/분류 된 인수는 the Ocaml manual에 설명되어 있습니다. 이 문제를 해결하는 올바른 방법은 문제가있는 인수 (이 경우 Option.value_exn)에 대해 명시 적으로 형식을 지정하는 것입니다. 실제로

Some(1) |> (Option.value_exn : int option -> int);; 

작품. 설명서는 예상 유형이 레이블이 지정되지 않은 함수 유형 인 특정 경우에

을 설명하며 인수는 선택적 매개 변수를 필요로하는 함수이므로 컴파일러는 인수를 변환하여

의 다형성이이 메커니즘을 방해하는 것처럼 보입니다. 장애를 일으키는 다발성 다발증이라는 증거는 장애가 발생했을 때와 같은 이유 때문에 실패로 간주됩니다.

5

아니요, 이들은 동일하지 않습니다.

utop # let (|>) a f = f a;; 
val (|>) : 'a -> ('a -> 'b) -> 'b = <fun> 

그래서,이 유형 'a 및 기능 'a -> 'b의 일부 값을 기대 : 같이 |> 연산자를 정의 할 수 있습니다.

그러나, Option.value_exn의 유형으로 인해 명명 된 매개 변수하지 'a -> 'b is : 당신은 명시 적으로 모든 명명 된 매개 변수를 지정할 수 있습니다

utop # Option.value_exn;; 
- : ?here:Lexing.position -> 
    ?error:Base.Error.t -> ?message:string -> 'a option -> 'a 

는 (제로 의미 실제로 수)

utop # Some 1 |> Option.value_exn ~here:Lexing.dummy_pos ~error:(Error.of_string "dummy") ~message:"dummy";; 
- : int = 1 

하거나 포장 람다를 사용 그것

utop # Some 1 |> fun x -> Option.value_exn x;; 
- : int = 1 
+0

그렇다면 '1 |> f가''f ((b = 0) a = a + b')와 어떻게 작동할까요? – rymdhund

+0

@rymdhund 왜냐하면 여기 b는 선택적 매개 변수이기 때문에 값을 줄 필요가 없습니다. 이것은 값을 지정해야하는 명명 된 매개 변수와 다릅니다. –