Как мне объявить трубопроводы? - PullRequest
4 голосов
/ 13 марта 2011

Имеет ли значение, как я объявляю конвейер?Я знаю три способа:

let hello name = "Hello " + name + "!"    
let solution1 = hello <| "Homer"
let solution2 = "Homer" |> hello

Какой бы вы выбрали?решение1 или решение2 - и почему?

Ответы [ 2 ]

7 голосов
/ 13 марта 2011

Как уже упоминалось, оператор "forward-pipe" |> помогает с составлением функции и выводом типа.Это позволяет вам переставить параметры функции, чтобы вы могли поставить последний параметр функции первым.Это позволяет создавать цепочки функций, которые очень удобочитаемы (аналогично LINQ в C #).Ваш пример не показывает всю мощь этого - он действительно сияет, когда у вас настроен «конвейер» преобразования для нескольких функций подряд.

Используя |> цепочку, вы можете написать:

let createPerson n =
    if n = 1 then "Homer" else "Someone else"

let hello name = "Hello " + name + "!"

let solution2 = 
  1 
  |> createPerson 
  |> hello 
  |> printf "%s"

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

Это будет эквивалентно:

let createPerson n =
    if n = 1 then "Homer" else "Someone else"

let hello name = "Hello " + name + "!"

let solution3 = hello <| createPerson 1
let solution4 = hello (createPerson 1)
3 голосов
/ 13 марта 2011

F # читает сверху вниз, слева направо. По этой причине оператор |> используется гораздо больше, чем <|, поскольку он помогает вывести тип.

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