2009-12-14 3 views
27

я заметил, в какой-то код в этом sample, который содержал >> оператор:В F #, что означает оператор?

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

Что означает >> оператор средней/сделать?

Большое спасибо, теперь это намного яснее. Вот мой пример я создал, чтобы повесить его:

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

Вы даже можете теперь будет более кратким: ... let new_list2 = read_lines "myText.txt" |> List.map (trim >> to_upper) ... Это форма, в которой я сама обрабатываю обработку данных. – cfern

+0

Удивительный, поэтому я мог бы превратить его в: let new_list2 = File.ReadAllLines (путь) |> Array.map (trim >> to_upper) ... очень аккуратно :) спасибо – Russell

+0

Смотрите, вы уже учитесь :) – cfern

ответ

55

Это оператор композиции функций.

Дополнительная информация о Chris Smith's blogpost.

введения функции Состав оператор (>>):

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

который гласит: даны две функции, F и г, а значение, х, вычисления результат f от x и передать этот результат в g. Интересная вещь: , что вы можете использовать функцию (>>) и передавать только параметры f и g, . Результат - это функция, которая принимает единственный параметр и производит результат g (f (x)) ,

Вот краткий пример составления функции из более мелких:

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 

При выполнении принты «-4».

12

Оператор >> составляет две функции, поэтому x |> (g >> f) = x |> g |> f = f (g x). Существует также другой оператор <<, который состоит из другого направления, так что (f << g) x = f (g x), что может быть более естественным в некоторых случаях.

1

Операторы композиции, << и >> используются для объединения двух функций, так что результат одного становится входом другого. Поскольку функция также является значением, если иной не отметить, что они рассматриваются как таковые, так что следующие выражения эквивалентны:

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

В частности, f2, f3, ...fn и x рассматриваются как значения и не оцениваются до того, передаются как параметров к их предыдущим функциям. Иногда это то, что вы хотите, но в другое время вы хотите указать, что result одной из функций должен быть входом другого.Это может быть реализовано с использованием операторов композиции << и >> таким образом:

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

Аналогично

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

Поскольку оператор композиции возвращает функцию, явный параметр, x, не требуется в отличие в операторах труб x |> fn ... |> f1 или f1 <| ... fn <| x

Смежные вопросы