打印到控制台和处理阵列

时间:2017-04-21 16:20:54

标签: f# console.writeline

我正在处理数组中的大量对象。这个处理需要很长时间,我希望能够监控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

但这会在<{1}}位上带错误

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

似乎有用。这是提供控制台文本的最佳方式吗?

1 个答案:

答案 0 :(得分:3)

看起来你想要:

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案例隐式具有类型(),因此类型不匹配。您只需打印该值,忽略结果,然后返回当前值。