모호한 제목에 대해 죄송하지만이 질문의 일부는 다음 두 가지 구문 스타일이 무엇인지에 대한 것입니다.
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
다른 부분은 둘 사이에 어떤 차이가 있으며 언제 둘 중 하나를 사용하고 싶습니까?
답변
일치 버전을 “패턴 일치 표현식”이라고합니다. 함수 버전을 “패턴 일치 함수”라고합니다. 사양 의 섹션 6.6.4에서 찾을 수 있습니다.
다른 하나를 사용하는 것은 스타일의 문제입니다. 나는 단지 match 문인 함수를 정의해야 할 때만 함수 버전을 사용하는 것을 선호합니다.
답변
두 번째 구문의 장점은 람다에서 사용할 때 좀 더 간결하고 읽기 쉽다는 것입니다.
List.map (fun x -> match x with | 1 -> "one" | _ -> "not one") [0;1;2;3;1]
vs
List.map (function 1 -> "one" | _ -> "not one") [0;1;2;3;1]
답변
함수 버전은 match 문이 전체 함수이고 함수에 단일 인수 만있는 특수한 경우에 전체 일치 구문의 약어입니다 (튜플은 하나로 계산 됨). 두 개의 인수를 원하면 전체 일치 구문 *을 사용해야합니다. 다음 두 가지 기능의 유형에서이를 확인할 수 있습니다.
//val match_test : string -> string -> string
let match_test x y = match x, y with
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
//val function_test : string * string -> string
let function_test = function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
보시다시피 일치 버전은 두 개의 개별 인수를 사용하는 반면 함수 버전은 단일 튜플 인수를 사용합니다. 함수 구문이 더 깔끔해 보이기 때문에 대부분의 단일 인수 함수에 함수 버전을 사용합니다.
* 정말로 원하는 경우 올바른 유형 시그니처를 갖도록 함수 버전을 얻을 수 있지만 내 의견으로는보기에는보기 흉합니다. 아래 예제를 참조하십시오.
//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
답변
그들은 귀하의 경우에 동일한 일을합니다- function
키워드는 fun
키워드 (익명 람다를 생성하기 위해) 와 키워드 의 조합처럼 작동 match
합니다.
따라서 기술적으로이 두 가지는 동일하며 다음을 추가합니다 fun
.
let foo1 = fun x ->
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
답변
완전성을 위해 Expert FSharp의 321 페이지에 도달했습니다 .
“참고, 목록 12-2는 표현식 형식을 사용합니다
function pattern-rules -> expression
. 이는(fun x -> match x with pattern-rules -> expression)
구별 된 공용체에 대해 직접 작동하는 함수를 정의하는 방법으로 특히 편리합니다.”
답변
function 은 하나의 인수 만 허용하지만 패턴 일치를 허용하는 반면 fun 은 함수를 정의하는보다 일반적이고 유연한 방법입니다. 여기를보세요 : http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
답변
두 구문은 동일합니다. 대부분의 프로그래머는 둘 중 하나를 선택하고 일관되게 사용합니다.
첫 번째 구문은 함수가 작업을 시작하기 전에 여러 인수를 허용 할 때 더 읽기 쉽습니다.