2011-03-13 9 views
4

파이프 라인을 선언하는 방법이 중요합니까? 저는 세 가지 방법을 알고 있습니다 :파이프 라인을 어떻게 선언해야합니까?

let hello name = "Hello " + name + "!"  
let solution1 = hello <| "Homer" 
let solution2 = "Homer" |> hello 

어느 쪽을 선택하겠습니까? solution1 또는 solution2 - 이유는 무엇입니까?

답변

7

파이프 전달 연산자 |>은 함수 구성 및 형식 유추에 도움이됩니다. 이 함수를 사용하면 함수의 매개 변수를 다시 배열 할 수 있으므로 함수의 마지막 매개 변수를 먼저 넣을 수 있습니다. 이렇게하면 매우 읽기 쉬운 함수를 연결할 수 있습니다 (C#의 LINQ와 유사). 귀하의 예는 이것의 힘을 보여주지 못합니다. 여러 기능을 연속적으로 "파이프 라인"으로 변환 할 때 정말 빛납니다.

사용 |>하면 쓸 수 체인 :

는 파이프 뒤로 운영자 <|의 장점은 당신에게 브래킷을 많이 절약 할 수 있도록이 연산자 우선 순위를 변경한다는 것입니다

let createPerson n = 
    if n = 1 then "Homer" else "Someone else" 

let hello name = "Hello " + name + "!" 

let solution2 = 
    1 
    |> createPerson 
    |> hello 
    |> printf "%s" 
: 함수 인수는 일반적으로 왼쪽 평가 맞습니다. <|을 사용하면 한 함수의 결과를 다른 함수에 전달하려는 경우 대괄호가 필요하지 않습니다. 예를 들어이 함수를 실제로 활용하지는 않습니다.

이 동등한 것 : - | '유용한 것

let createPerson n = 
    if n = 1 then "Homer" else "Someone else" 

let hello name = "Hello " + name + "!" 

let solution3 = hello <| createPerson 1 
let solution4 = hello (createPerson 1) 
+0

대신'let solution5 = createPerson 1 | hello' 대신'Exception()'을 사용할 수 있습니까? – ebb

+0

@ebb : 더 좋은 예제는'1 |> createPerson |> hello' 일 것입니다 - 예제가 너무 효과적이지만'1'은 상수이므로 – BrokenGlass

+0

상수를 사용하지 않고 예제를 사용 하시겠습니까? – ebb

3

F #은 위에서 아래로, 왼쪽에서 오른쪽으로 읽습니다. 이러한 이유 때문에 |> 연산자는 형식 유추를 도와주기 때문에 <| 이상에 많이 사용됩니다.

+0

@J 쿠퍼'<어떤 경우가 있습니까? – ebb

+0

가끔 괄호를 피하기 위해'if not <| '와 같이 사용할 수 있습니다. f x y then ... ' –

+3

나는'raise <|'를 사용하는 것을 선호한다. '(raise Exception())'또는 뒤의'Exception() |> raise' – petebu

관련 문제