Передача по каналу другого параметра в строку в F#

Передает параметр по каналу в строку, работает только на функции, которые принимают один параметр? Если мы смотрим на пример на уровне страницы 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)
Я думаю, что должен смочь использовать оператора трубопровода с функциями, имеющими несколько входных параметров, правильно? Что я пропускаю?

6
задан demokritos 25 February 2010 в 00:36
поделиться

2 ответа

При смешивании операторов конвейера и каррированных аргументов помните о порядке передачи аргументов.

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
14
ответ дан 8 December 2019 в 04:29
поделиться

Пример, который вы предложили, должен работать нормально, аля

let add x y = x + y

41
|> add 1
|> printfn "%d"

Если filesUnderFolder принимает два аргумента curried, и вы частично применяете его к одному аргументу, вы можете использовать его в конвейере для другого.

(Обратите внимание также на менее известный оператор конвейера ||>

(41,1)
||> add
|> printfn "%d"

который принимает 2 кортежа и последовательно передает их в то, что следует)

.
9
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: