Печать на консоль и обработка массива
Я обрабатываю большое количество объектов, размещенных в массиве. Эта обработка занимает много времени, и я хотел бы иметь возможность отслеживать, где на этапе обработки находится 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
случай неявно имеет тип ()
поэтому типы не совпадают. Вы можете просто напечатать значение, проигнорировать результат и затем вернуть текущее значение.