2010-02-25 29 views
6

Tham số đường ống vào đường chỉ hoạt động với các hàm chấp nhận một tham số? Nếu chúng ta nhìn vào ví dụ ở Chris Smiths' page,Đường ống một tham số khác vào dòng trong F #


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

nơi chức năng filesUnderFolder mình đã mong chỉ tham số rootFolder, gì nếu hàm được mong đợi hai tham số, tức là
let filesUnderFolder size rootFolder

Sau đó, điều này không làm việc :


// 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 

Vì tôi có thể xác định
let inline (>>) f g x y = g(f x y)
Tôi nghĩ tôi có thể sử dụng toán tử đường ống với các hàm có nhiều thông số đầu vào, phải không? Tôi đang thiếu gì?

Trả lời

10

Khi trộn vận hành đường ống dẫn và lý lẽ cà ri được nhận thức của để bạn vượt qua đối số.

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

Hãy nghĩ về việc trình biên dịch đặt dấu ngoặc đơn quanh hàm và tham số của hàm như thế này.

@"C:\Users\chrsmith\Pictures\" |> filesUnderFolder size
trở thành
@"C:\Users\chrsmith\Pictures\" |> (filesUnderFolder size)
hoặc
(filesUnderFolder size) @"C:\Users\chrsmith\Pictures\"

Out of nhằm dụ

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

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

1 |> print2 2;; 
2 - 1 

Với ba đối số

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 

Định nghĩa

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

cảm ơn rất nhiều đại biểu, là giá trị được trả lại từ trên đường ống, tôi có thể coi đó là đối tượng không? một cái gì đó như: kích thước, @ "C: \ Users \ chrsmith \ Hình ảnh \" ||> filesUnderFolder |> .GetLength() – demokritos

+0

Là một đối tượng không, nhưng bạn có thể tạo một hàm mới với '(|>)' nhà điều hành, cũng không có cách chung để chuyển một hàm thành viên làm đối số trong F #. Bạn phải bọc nó trong một hàm. 'size, @" C: \ Users \ chrsmith \ Hình ảnh \ "||> filesUnderFolder |> (vui vẻ x -> x.GetLength())' – gradbot

6

Ví dụ bạn đề nghị nên làm việc tốt, a la

let add x y = x + y 

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

Nếu filesUnderFolder mất hai args cà ri, và bạn phần nào áp dụng nó vào một arg, bạn có thể sử dụng nó trong các đường ống dẫn cho người kia.

(Cũng lưu ý các đường ống dẫn ít được biết đến hành ||>

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

mà phải mất một 2-tuple và thức ăn chúng liên tục vào những gì sau.)

+0

|||> cũng được định nghĩa trong prim- types.fs :) – gradbot

+0

Hey! Đó là nhà điều hành đường ống mới với tôi, chắc chắn là một trong những để giữ cho tay áo của tôi. – Benjol

+0

Xin cảm ơn các bạn. bây giờ tôi có thể có giá trị đơn hoặc ống, câu hỏi tiếp theo của tôi là tôi có thể thêm danh sách/mảng filesUnderFolder |> Seq.map FileInfo vấn đề của mình là tôi không thể xử lý với đường ống |> hoặc có thể? Assembly.GetExecutingAssembly.GetFiles() demokritos

0

Nó có thể là phong cách xấu (?), Nhưng bạn có thể thêm các thông số bổ sung cho các đường ống dẫn 'từ phía bên phải'

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) 
Các vấn đề liên quan