В Linux есть прекрасная команда tee, которая берёт вывод какой-то команды, записывает его в файл, и в то же время выводит на консоль:
А ещё в Linux shell есть pipe-lining, очень похожий на pipe-lining из F#.
Эти два обстоятельства и одна задачка, возникшая на работе, натолкнули меня на мысль, что в F# можно добавить аналог tee. Вот, например, такой код:
К счастью, в F# подобные задачки решаются тривиально:
Эти два обстоятельства и одна задачка, возникшая на работе, натолкнули меня на мысль, что в F# можно добавить аналог tee. Вот, например, такой код:
open System let rnd = new Random() [| for _ in 0..100 -> rnd.Next(100) |] .|> "array.txt" |> Array.sum |> printfn "%i"создаст массив из случайных целых чисел, запишет его в файл "array.txt", посчитает сумму элементов массива и напечатает её на консоль. Осталось только реализовать этот магический оператор (.|>)!
К счастью, в F# подобные задачки решаются тривиально:
open System.IO let inline ( .|> ) data fileName = File.WriteAllLines(fileName, Seq.map (sprintf "%A") data) data //val inline ( .|> ) : 'a -> string -> 'a when 'a :> seq<'b>Обратите внимание: сия магия работает только с коллекциями (для меня это самый частый use case). На самом деле, можно использовать WriteAllText и sprintf "%A" data соответственно, но тогда слишком длинные коллекции будут обрубаться.
Комментариев нет:
Отправить комментарий