Как обратиться к параметру конвейера f # по имени? - PullRequest
1 голос
/ 03 сентября 2010

Я пытаюсь сделать что-то вроде

seq { 1..100 }
|> Seq.sum
|> pown 2

Он даже не компилируется, потому что pown ожидает аргумент 'T ^' в качестве первого аргумента, а я даю его как второй, так как это поведение конвейера по умолчанию. Погуглив, я не нашел способа заставить pown использовать параметр, переносимый конвейером, в качестве первого аргумента. Может быть, у него есть имя по умолчанию?

Ответы [ 3 ]

5 голосов
/ 03 сентября 2010

Вы можете использовать вспомогательную функцию:

let flip f x y = f y x

seq { 1L..100L }
    |> Seq.sum
    |> flip pown 2

Будет здорово иметь flip в стандартной библиотеке:)

4 голосов
/ 03 сентября 2010

Вы можете использовать лямбду, чтобы присвоить входящему значению имя:

seq { 1..100 } 
|> Seq.sum 
|> (fun x -> pown x 2)

Выше я назвал это x.

1 голос
/ 03 сентября 2010

Я обычно не использую конвейер, если аргументы не совпадают, потому что я чувствую, что это может повредить читабельности.Вариант Брайана вполне понятен, но он мало чем отличается от присвоения результата значению (использование let вместо конвейера и fun).

Итак, я бы просто написал это (без какой-либо приятной функциональной магии):

let x = seq { 1 .. 100 } |> Seq.sum
pown x 2

По сути, это то же самое, что и версия Брайана - вы также присваиваете результат значению - но это более просто.Вероятно, я бы использовал более описательное имя, например sumResult вместо x.

Версия, использующая flip, довольно стандартная вещь в Haskell, хотя я также считаю, что ее может стать трудно читатьне в этом простом случае, но если объединить несколько функций, это может легко стать ужасным).Я думаю, что это также причина, по которой flip (и другие) отсутствуют в библиотеках F #.

...