2017-04-21 16 views
3

アレイに格納された多数のオブジェクトを処理しています。この処理には時間がかかりますが、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分の1または100分の1または1000の印刷を行います。だから無視され、コンソールに何も印刷していない、私は基本的に何もしないようにelse...ブランチをしたい私は

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 

を試してみたが、これは

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. 

printfn...ビット以上のエラーを提供します。

は興味深いことに、この質問を書いて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 

動作するように思われます。これは、コンソールテキストを提供する最善の方法ですか?

答えて

3

あなたが望むように見えます:

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

if式の両方の枝が真の場合のタイプ(unit, int)の値を返します

同じタイプと

if (i % 100 = 0) then printfn "Processing n %i" i, (n * 2) 
を持っている必要があります。紛失した elseの場合は、暗黙的にタイプが ()であるため、タイプが一致しません。値を出力し、結果を無視して現在の値を返すことができます。

+0

パーフェクト。これは私が上で持っていた 'match'ステートメントよりもあまり冗長ではありません!ありがとう。 – Steven