2009-12-14 54 views
27

tôi nhận thấy ở một số mã trong sample này có chứa các >> nhà điều hành:Trong F #, toán tử >> có nghĩa là gì?

let printTree = 
    tree >> Seq.iter (Seq.fold (+) "" >> printfn "%s") 

Gì >> nhà điều hành trung bình/làm gì?

Cảm ơn rất nhiều, giờ đây rõ ràng hơn rất nhiều. Dưới đây là ví dụ của tôi, tôi tạo ra để nhận được hang của nó:

open System 
open System.IO 

let read_lines path = File.ReadAllLines(path) |> Array.to_list 

let trim line = (string line).Trim() 
let to_upper line = (string line).ToUpper() 

let new_list = [ for line in read_lines "myText.txt" -> line |> (trim >> to_upper) ] 

printf "%A" new_list 
+0

Bạn thậm chí có thể được ngắn gọn hơn bây giờ: ... let new_list2 = read_lines "myText.txt" |> List.map (trim >> to_upper) ... Đây là hình thức mà tôi viết dữ liệu xử lý bản thân mình. – cfern

+0

Tuyệt vời, vì vậy tôi có thể biến nó thành: hãy new_list2 = File.ReadAllLines (đường dẫn) |> Array.map (trim >> to_upper) ... rất gọn gàng :) cảm ơn – Russell

+0

Xem, bạn đang học đã :) – cfern

Trả lời

55

Đó là toán tử thành phần hàm.

Thông tin thêm về Chris Smith's blogpost.

Giới thiệu Chức năng Thành phần điều hành (>>):

let inline (>>) f g x = g(f x)

nào đọc như: cho hai chức năng, f và g, và một giá trị, x, tính toán kết quả của f của x và vượt qua kết quả đó đến g. Điều thú vị ở đây là mà bạn có thể cà ri hàm (>>) và chỉ truyền tham số f và g, kết quả là hàm lấy tham số đơn và tạo kết quả g (f (x)) .

Dưới đây là một ví dụ nhanh của sáng tác một hàm ra khỏi những cái nhỏ hơn:

let negate x = x * -1 
let square x = x * x 
let print x = printfn "The number is: %d" x 
let square_negate_then_print = square >> negate >> print 
asserdo square_negate_then_print 2 

Khi thực hiện in ‘-4’.

12

Nhà điều hành >> soạn hai chức năng, vì vậy x |> (g >> f) = x |> g |> f = f (g x). Ngoài ra còn có một toán tử khác << được tạo theo một hướng khác, sao cho số (f << g) x = f (g x), điều này có thể tự nhiên hơn trong một số trường hợp.

1

Các toán tử thành phần, <<>> được sử dụng để nối hai hàm sao cho kết quả của một hàm trở thành đầu vào của hàm kia. Kể từ khi chức năng cũng là những giá trị, trừ trường hợp lưu ý, họ được đối xử như vậy để các biểu thức sau là tương đương:

f1 f2 f3 ... fn x = (..((f1 f2) f3) ... fn) x

Cụ thể, f2, f3, ...fnx được coi là giá trị và không được đánh giá trước khi được thông qua như là tham số cho các hàm trước của chúng. Đôi khi đó là những gì bạn muốn nhưng lần khác bạn muốn chỉ ra rằng result của một chức năng là đầu vào của cái kia.Điều này có thể được thực hiện bằng cách sử dụng các nhà khai thác thành phần <<>> như sau:

(f1 << f2 << f3 ... << fn) x = f1(f2(f3 ... (fn x)..)

Tương tự

(fn >> ... f3 >> f2 >> f1) x = f1(f2(f3 ... (fn x)..)

Kể từ khi các nhà điều hành phần trả về một chức năng, các thông số rõ ràng, x, không được yêu cầu không giống như trong các nhà khai thác đường ống x |> fn ... |> f1 hoặc f1 <| ... fn <| x

Các vấn đề liên quan