Programing

F # 명시 적 일치 대 함수 구문

lottogame 2020. 10. 14. 07:18
반응형

F # 명시 적 일치 대 함수 구문


모호한 제목에 대해 죄송하지만이 질문의 일부는 다음 두 가지 구문 스타일이 무엇인지에 대한 것입니다.

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


The two syntaxes are equivalent. Most programmers choose one or the other and then use it consistently.

The first syntax remains more readable when the function accepts several arguments before starting to work.


This is an old question but I will throw my $0.02.

In general I like better the match version since I come from the Python world where "explicit is better than implicit."

Of course if type information on the parameter is needed the function version cannot be used.

OTOH I like the argument made by Stringer so I will start to use function in simple lambdas.

참고URL : https://stackoverflow.com/questions/1839016/f-explicit-match-vs-function-syntax

반응형