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

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

Моя цель - иметь возможность печатать на консоли что-то вроде 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

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


person Steven    schedule 21.04.2017    source источник


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

person Lee    schedule 21.04.2017
comment
Идеально. Это гораздо менее многословно, чем оператор match, который я привел выше! Спасибо. - person Steven; 21.04.2017