________fear_of_underscores

вторник, 25 сентября 2012 г.

F#un tee pipe

В Linux есть прекрасная команда tee, которая берёт вывод какой-то команды, записывает его в файл, и в то же время выводит на консоль:

А ещё в Linux shell есть pipe-lining, очень похожий на pipe-lining из 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 соответственно, но тогда слишком длинные коллекции будут обрубаться.

Комментариев нет:

Отправить комментарий