Как называется |> в F # и для чего это нужно? - PullRequest
9 голосов
/ 13 апреля 2010

Настоящий вопрос F # noob, но как это называется?> И что он делает?

Ответы [ 4 ]

12 голосов
/ 13 апреля 2010

Это называется оператор прямого канала . Он передает результат одной функции в другую.

Оператор прямой трубы определяется следующим образом:

let (|>) x f = f x

И имеет тип подписи:

'a -> ('a -> 'b) -> 'b

Что разрешается следующим образом: дан универсальный тип 'a и функция, которая принимает' a и возвращает a 'b, а затем возвращает применение функции на входе.

Подробнее о том, как это работает, вы можете прочитать в статье здесь .

8 голосов
/ 13 апреля 2010

Я обычно называю |> оператором конвейерной обработки , но я не уверен, является ли официальное имя оператором труб или оператором конвейерной обработки ( хотя это, вероятно, и не имеет значения, поскольку имена достаточно похожи, чтобы избежать путаницы: -)).

@ Л.Бушкин уже дал отличный ответ, поэтому я просто добавлю пару замечаний, которые также могут быть интересными. Очевидно, что оператор конвейерной обработки получил свое имя, потому что его можно использовать для создания конвейера, который обрабатывает некоторые данные в несколько этапов. Типичное использование при работе со списками:

[0 .. 10] 
  |> List.filter (fun n -> n % 3 = 0) // Get numbers divisible by three
  |> List.map (fun n -> n * n)        // Calculate squared of such numbers

Это дает результат [0; 9; 36; 81]. Кроме того, оператор является левоассоциативным, что означает, что выражение input |> f |> g интерпретируется как (input |> f) |> g, что позволяет последовательно выполнять несколько операций, используя |>.

Наконец, я нахожу весьма интересным, что оператор конвейерной обработки во многих случаях соответствует цепочке методов из объектно-ориентированных языков. Например, предыдущий пример обработки списка будет выглядеть следующим образом в C #:

Enumerable.Range(0, 10) 
  .Where(n => n % 3 == 0)    // Get numbers divisible by three
  .Select(n => n * n)        // Calculate squared of such numbers

Это может дать вам некоторое представление о том, когда можно использовать оператор, если вы приходите из объектно-ориентированного фона (хотя он используется во многих других ситуациях в F #).

3 голосов
/ 13 апреля 2010

Что касается самого F #, имя - op_PipeRight (хотя никто не назвал бы это так). Я произношу это как "труба", как труба в Unix.

Спецификация полезна для выяснения подобных вещей. Раздел 4.1 содержит имена операторов.

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html

2 голосов
/ 13 апреля 2010

Не забудьте проверить справочные документы библиотеки:

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

, в котором перечислены операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...