Печать на консоль и обработка массива

Я обрабатываю большое количество объектов, размещенных в массиве. Эта обработка занимает много времени, и я хотел бы иметь возможность отслеживать, где на этапе обработки находится fx.

Моя цель - иметь возможность выводить на консоль какую-то Processing thing number *x* продолжая работать. Например, с этим

let x = [|1..10..100000|]

x 
|> Array.mapi (fun i n -> (i, n))
|> Array.map (fun (i, n) -> printfn "Processing n %i" i, (n * 2)))
|> Array.map snd

Я получаю вывод для каждой строки. Я бы хотел, чтобы каждые 10, 100 или 1000 печатали операторы, а не каждую строку. Итак, я попробовал

x 
|> Array.mapi (fun i n -> (i, n))
|> Array.map (fun (i, n) -> (if (i % 100 = 0) then printfn "Processing n %i" i, (n * 2)))
|> Array.map snd

но это дает ошибку над printfn... немного с

The 'if' expression is missing an else branch. The 'then' branch has type
''a * 'b'. Because 'if' is an expression, and not a statement, add an 'else'
branch which returns a value of the same type.

Я по сути хочу else... ветка ничего не делает, ничего не выводит на консоль, просто игнорируется.

Интересно, что при написании этого вопроса и попытках FSIЯ попробовал это:

x 
|> Array.mapi (fun i n -> (i, n))
|> Array.map (fun (i, n) -> match (i % 100 = 0) with 
                            | true -> printfn "Processing n %i" i, (n * 2)
                            | false -> (), n * 2)
|> Array.map snd

который, кажется, работает. Это лучший способ предоставить текст консоли?

1 ответ

Решение

Похоже, вы хотите:

let x' = x |> Array.mapi (fun i n ->
        if i % 100 = 0 then
            printfn "Processing n %i" i
        n)

Обе ветви if выражение должно иметь тот же тип и

if (i % 100 = 0) then printfn "Processing n %i" i, (n * 2)

возвращает значение типа (unit, int) для истинного случая. Пропажа else случай неявно имеет тип () поэтому типы не совпадают. Вы можете просто напечатать значение, проигнорировать результат и затем вернуть текущее значение.

Другие вопросы по тегам