В WebSharper есть оператор, которого вы можете определить следующим образом:
let (|!>) a f = f a; a
Позволяет вам вызвать функцию типа 'a -> unit
для входного значения, возвращающего то же значение.
Исправление вашего кода потребует небольшого изменения:
lines
|> Seq.filter isImportLine
|!> Seq.iter (printfn "Libs found: %s")
|> Seq.map getPathToLibFile // error in this line
|> Seq.iter (printfn "Path to libs: %s")
С другой стороны, вы должны будете повторить коллекцию дважды, что может оказаться не тем, что вы хотите.
Лучшим подходом было бы определение функции Do (строчная буква do
является зарезервированным ключевым словом в F #), которая вводит побочный эффект при итерации последовательности. Rx.NET (Ix) предоставляет такую функцию в EnumerableEx:
let Do f xs = Seq.map (fun v -> f v; v) xs
и тогда вы можете ввести побочный эффект следующим образом:
lines
|> Seq.filter isImportLine
|> Do (printfn "Libs found: %s")
|> Seq.map getPathToLibFile // error in this line
|> Seq.iter (printfn "Path to libs: %s")
Побочный эффект будет введен только после итерации коллекции в последней строке.