2010-02-25 3 views
6

파이핑 매개 변수가 선으로 연결되는 것은 하나의 매개 변수를 허용하는 함수에서만 작동합니까? 우리가 Chris Smiths' page의 예를 보면, F에있는 라인에 다른 매개 변수를 파이핑


// Using the Pipe-Forward operator (|>) 
let photosInMB_pipeforward = 
    @"C:\Users\chrsmith\Pictures\" 
    |> filesUnderFolder 
    |> Seq.map fileInfo 
    |> Seq.map fileSize 
    |> Seq.fold (+) 0L 
    |> bytesToMB 

함수가 다음이 작동하지 않습니다 즉,
let filesUnderFolder size rootFolder

을 두 개의 매개 변수를 기다리고 있었다 어떤 경우 자신의 filesUnderFolder의 기능은 rootFolder 매개 변수, 을 기다리고 있었다 :


// Using the Pipe-Forward operator (|>) 
let size= 4 
let photosInMB_pipeforward = 
    @"C:\Users\chrsmith\Pictures\" 
    |> filesUnderFolder size 
    |> Seq.map fileInfo 
    |> Seq.map fileSize 
    |> Seq.fold (+) 0L 
    |> bytesToMB 

내가
을 정의 할 수 있기 때문에 let inline (>>) f g x y = g(f x y)
여러 입력 매개 변수가있는 함수로 파이프 라인 연산자를 사용할 수 있어야한다고 생각하십니까? 내가 뭘 놓치고 있니?

답변

10

파이프 라인 연산자를 혼합 카레 인수가 인식 인수를 전달하는 순서.

let size = 4 
let photosInMB_pipeforward = 
    size, @"C:\Users\chrsmith\Pictures\" 
    ||> filesUnderFolder 
    |> Seq.map fileInfo 
    |> Seq.map fileSize 
    |> Seq.fold (+) 0L 
    |> bytesToMB 

마치 컴파일러가 함수와 매개 변수를 괄호로 묶는 것처럼 생각하면됩니다.

@"C:\Users\chrsmith\Pictures\" |> filesUnderFolder size
세 인수

let print3 x y z = printfn "%A - %A - %A" x y z;; 

(1, 2, 3) |||> print3;; 
1 - 2 - 3 

(2, 3) ||> print3 1;; 
1 - 2 - 3 

3 |> print3 1 2;; 
1 - 2 - 3 
012와
@"C:\Users\chrsmith\Pictures\" |> (filesUnderFolder size)
또는 주문 예

let print2 x y = printfn "%A - %A" x y;; 

(1, 2) ||> print2;; 
1 - 2 

1 |> print2 2;; 
2 - 1 


(filesUnderFolder size) @"C:\Users\chrsmith\Pictures\"

진다 3,516,

정의

let inline (|>) x f = f x 

let inline (||>) (x1,x2) f = f x1 x2 

let inline (|||>) (x1,x2,x3) f = f x1 x2 x3 
+0

덕분에 gradbot 덕분에 은 파이프 라인에서 반환 된 값입니다. 객체로 처리 할 수 ​​있습니까? 크기, @ "C : \ Users \ chrsmith \ Pictures \" ||> filesUnderFolder |> .GetLength() – demokritos

+0

개체로는 아니지만'(|>) '로 새 함수를 만들 수 있습니다. 연산자를 사용하는 경우에도 F #에서 인수로 멤버 함수를 전달하는 일반적인 방법은 없습니다. 그것을 함수로 묶어야합니다. 'size, @ "C : \ Users \ chrsmith \ Pictures \"||> filesUnderFolder |> (재미있는 x-> x.GetLength())' – gradbot

6

당신이 제안 예는 잘 작동합니다, 라

let add x y = x + y 

41 
|> add 1 
|> printfn "%d" 

filesUnderFolder 두 카레 인수를 받아, 당신은 부분적으로 하나 개의 인수에 적용 할 경우 다른위한 파이프 라인에서 사용할 수 있습니다.

(주 또한 덜 알려진 파이프 라인 2 튜플을 받아 다음과 무엇에 순차적으로 공급 사업자 ||>

(41,1) 
||> add 
|> printfn "%d" 

.)

+0

'오른쪽에서'파이프 라인에 추가 매개 변수를 추가 할 수 있습니다 |||>는 prim-에 정의되어 types.fs :) – gradbot

+0

안녕하세요! 그 파이프 라인 운영자는 내게 새 것이지, 분명히 내 소매를 유지하는 사람이다. – Benjol

+0

감사합니다. 이제 단일 값 또는 tubles 수, 내 다음 질문은 목록/배열을 추가 할 수 있습니다. filesUnderFolder |> Seq.map FileInfo 내 문제는 파이프 라인으로 처리 할 수없는 |, 또는 수 있습니까? Assembly.GetExecutingAssembly.GetFiles() demokritos

0

그것은 나쁜 스타일 (?)있을 수 있습니다,하지만 당신은

let h x y z = x + y - z 

let sub x y = x - y 

let sqr x = x * x 

3 |> h <| 2 <| 7 
    |> sub <| 23 
    |> sqr 

// is the same as 
sqr (sub (h 3 2 7) 23) 
관련 문제