2017-03-24 4 views
1

OCaml을 배우기 시작한 직전에 문자열을 출력하는 것으로 놀고있었습니다. , 단순히 "The day is Monday"가 출력합니다OCaml 일치 및 기능 불일치에 대한 설명

open Printf;; 

type days = 
    | Monday 
    | Tuesday 
    | Wednesday 
    | Thursday 
    | Friday 
    | Saturday 
    | Sunday 

let string_from_day day = match day with 
    | Monday -> "Monday" 
    | Tuesday -> "Tuesday" 
    | Wednesday -> "Wednesday" 
    | Thursday -> "Thursday" 
    | Friday -> "Friday" 
    | Saturday -> "Saturday" 
    | Sunday -> "Sunday" 

let d = Monday;; 

Printf.printf "The day is %s \n" (string_from_day d);; 

이 잘 실행 :

은 내가 ocamlc를 통해 실행하고하는 것을 냈다.

그러나 Real World OCaml에는 function 키워드로 내 기능을 정의 할 수 있다고 나와 있습니다.

Error: This expression has type days -> string 
     but an expression was expected of type string 

내 질문은 왜 :

open Printf;; 

type days = 
    | Monday 
    | Tuesday 
    | Wednesday 
    | Thursday 
    | Friday 
    | Saturday 
    | Sunday 

let string_from_day day = function 
    | Monday -> "Monday" 
    | Tuesday -> "Tuesday" 
    | Wednesday -> "Wednesday" 
    | Thursday -> "Thursday" 
    | Friday -> "Friday" 
    | Saturday -> "Saturday" 
    | Sunday -> "Sunday" 

let d = Monday;; 

Printf.printf "The day is %s \n" (string_from_day d);; 

은, 그러나, 다음과 같은 오류가 발생합니다 : 그것은처럼 보였다 있도록 그래서 난 내 코드를 재 작성? 내 이해는 string_from_day 함수는 두 버전 모두에서 문자열로 평가되어야합니다.

내가 match 키워드 최상위 수준으로 기능을 입력하면 본인은 function 키워드 최상위 수준으로 기능을 입력 할 때

val string_from_day : days -> bytes = <fun> 

은 내가

val string_from_day : 'a -> days -> bytes = <fun> 

를 참조 얻을 수 최상위 결과가 두 가지 모두 다르지만 카레 기능은 bytes으로 끝납니다. 실제 세계 OCaml 책은 이것들은 동등하지만 그렇게 보이지 않는다고 말합니다. 더 자세한 정보에 대한 설명이나 포인터가 있으면 감사하겠습니다.

답변

4

키워드 function을 사용하는 경우 더 이상 필요하지 않으므로 인수 선언의 이름을 함수 선언에 쓰지 않아야합니다.

let string_of_day = function 
    | Monday -> ... 

주의 깊게 확인 RWO에 주어진 예 :

# let some_or_zero = function 
    | Some x -> x 
    | None -> 0 
    ;; 

val some_or_zero : int option -> int = <fun> 
# List.map ~f:some_or_zero [Some 3; None; Some 4];; 
- : int list = [3; 0; 4] 

함수의 선언이 인수를 언급하지 않습니다 이것은 당신이 쓰고 싶은 것입니다. 실제로 그것은 패턴 매칭에 즉시 주어지기 때문에 필요하지 않습니다.

let f = function ... 

그게

let f x = match x with ... 
+0

아 당신에게 감사하고 엄격하게 동일합니다! 나는 그 다음 예제도보고 있었지만 다른 사용법을 본다. – Jesse

+0

예, 'function' 키워드는 * last * 인수를 대체합니다. RWO에서 볼 수 있듯이 이전에 다른 인수를 추가 할 수 있습니다. :) – RichouHunter

+0

'function'은 특별한 인자 구문이나 그와 같은 것이 아니라 단지 하나의 인자로 된 익명 함수를 정의한다는 것에주의하십시오. 그것은'fun x -> x와 일치하는 ... '에 대한 속기입니다. – gsg