При смешивании операторов конвейера и аргументов карри следует учитывать порядок передачи аргументов.
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 size
становится
@"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