Передает параметр по каналу в строку, работает только на функции, которые принимают один параметр? Если мы смотрим на пример на уровне страницы Chris Smiths,
// Using the Pipe-Forward operator (|>)
let photosInMB_pipeforward =
@"C:\Users\chrsmith\Pictures\"
|> filesUnderFolder
|> Seq.map fileInfo
|> Seq.map fileSize
|> Seq.fold (+) 0L
|> bytesToMB
где его функция filesUnderFolder ожидала только параметр корневой папки, что, если функция ожидала два параметра, т.е.let filesUnderFolder size rootFolder
Затем это не работает:
// Using the Pipe-Forward operator (|>)
let size= 4
let photosInMB_pipeforward =
@"C:\Users\chrsmith\Pictures\"
|> filesUnderFolder size
|> Seq.map fileInfo
|> Seq.map fileSize
|> Seq.fold (+) 0L
|> bytesToMB
Так как я могу определитьlet inline (>>) f g x y = g(f x y)
Я думаю, что должен смочь использовать оператора трубопровода с функциями, имеющими несколько входных параметров, правильно? Что я пропускаю?
При смешивании операторов конвейера и каррированных аргументов помните о порядке передачи аргументов.
let size = 4
let photosInMB_pipeforward =
size, @"C:\Users\chrsmith\Pictures\"
||> filesUnderFolder
|> Seq.map fileInfo
|> Seq.map fileSize
|> Seq.fold (+) 0L
|> bytesToMB
Подумайте об этом так, как будто компилятор заключает функцию и ее параметры в круглые скобки, как это.
@ "C: \ Users \ chrsmith \ Pictures \" |> размер filesUnderFolder
становится
@ "C: \ Users \ chrsmith \ Pictures \" |> (filesUnderFolder size)
или
(filesUnderFolder size) @ "C: \ Users \ chrsmith \ Pictures \"
Пример не по порядку
let print2 x y = printfn "%A - %A" x y;;
(1, 2) ||> print2;;
1 - 2
1 |> print2 2;;
2 - 1
С тремя аргументами
let print3 x y z = printfn "%A - %A - %A" x y z;;
(1, 2, 3) |||> print3;;
1 - 2 - 3
(2, 3) ||> print3 1;;
1 - 2 - 3
3 |> print3 1 2;;
1 - 2 - 3
Определения
let inline (|>) x f = f x
let inline (||>) (x1,x2) f = f x1 x2
let inline (|||>) (x1,x2,x3) f = f x1 x2 x3
Пример, который вы предложили, должен работать нормально, аля
let add x y = x + y
41
|> add 1
|> printfn "%d"
Если filesUnderFolder
принимает два аргумента curried, и вы частично применяете его к одному аргументу, вы можете использовать его в конвейере для другого.
(Обратите внимание также на менее известный оператор конвейера ||>
(41,1)
||> add
|> printfn "%d"
который принимает 2 кортежа и последовательно передает их в то, что следует)
.