Семантика оператора ">>" в F # - PullRequest
3 голосов
/ 13 мая 2009

В Microsoft F # примеров они используют оператор ">>" следующим образом:

test |> Seq.iter (any_to_string >> printfn "line %s");

Что делает оператор ">>" в этом контексте? Каждый элемент последовательности (в данном случае массив) неявно передается в any_to_string? Это похоже на (fun item -> printfn "line %A" item)?

Ответы [ 6 ]

8 голосов
/ 13 мая 2009

(>>) - это функция высшего порядка, которая принимает две функции (с совместимыми аргументами) и объединяет («компонует») их в одну функцию.

Например, с

let len (s : string) = s.Length
let show (n : int) = n.ToString()

Линия

(show >> len) 15

эквивалентно

len (show 15)

а также

show 15 |> len
5 голосов
/ 13 мая 2009

Эквивалентный фрагмент кода может быть записан следующим образом:


test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))

Другими словами, оператор >> просто делает это: учитывая функцию f (x), возвращающую тип T и g (y), где y имеет тип T, вы можете использовать f >> g для создания функции h ( z) эквивалентен g (f (x)). Никакой аргумент, но внутренняя и внешняя функция должны быть переданы этому оператору, и результатом является функция, которая может быть применена в любое время в вашем коде, так что вы можете сделать это:


//myFunc accepts any object, calls its ToString method, passes ToString
//result to the lambda which returns the string length. no argument is
//specified in advance
let myFunc = any_to_string >> (fun s -> s.Length)
let test = 12345
let f = 12345.0
//now we can call myFunc just like if we had definied it this way:
//let myFunc (x:obj) = obj.ToString().Length
printfn "%i" (myFunc i)
printfn "%i" (myFunc f)
5 голосов
/ 13 мая 2009

Определение на

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html

говорит

val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first

Но я надеюсь, что другие дадут более глубокое объяснение.

EDIT

Документ MSDN теперь на

http://msdn.microsoft.com/en-us/library/ee353825(VS.100).aspx

3 голосов
/ 14 мая 2009

Это может быть бесполезно, если вас не устраивает C #, дженерики или лямбды, но вот эквивалент в C #:

//Takes two functions, returns composed one
public static Func<T1, T2> Compose<T1, T2, T3>(this Func<T1, T2> f, Func<T2, T3> g)
{
    return (x) => g(f(x));
}

Просмотр параметров типа читает что-то вроде ответа Брайана:

Compose принимает одну функцию, которая идет от T1 до T2, и другую, которая идет от T2 до T3, и возвращает комбинацию двух, которая идет от T1 до T3.

3 голосов
/ 13 мая 2009

Это оператор композиции функций (как описано в других постах)

Вы можете определить этот оператор самостоятельно, чтобы увидеть его семантику:

let (>>) f g = fun x -> g (f x)
2 голосов
/ 13 мая 2009

Оператор >> выполняет композицию функций, что довольно неплохо объясняется в Википедии . Дастин Кэмпбелл (Dustin Campbell) очень хорошо его использует и объясняет (вместе с оператором |> (forward pipe)) в своем блоге .

...