2016-05-23 16 views
2

私はここで本当に簡単なものがないと思います。F#関数が呼び出されずに実行されています

このコード

open System.Threading 

let duration = 1000 

module SequentialExample = 
    let private someTask item = 
     printfn "oh god why" 
     Thread.Sleep(duration) 
     item + " was computed" 

    let private items = [ 
     "foo" 
     "bar" 
     "baz" 
    ] 

    let getComputedItems = 
     printfn "heh" 
     [for item in items -> someTask item] 
     |> Array.ofList 

module ParallelExample = 
    let private someTask item = 
     printfn "that's ok" 
     Thread.Sleep(duration) 
     item + " was computed" 

    let private items = [ 
     "foo" 
     "bar" 
     "baz" 
    ] 

    let getComputedItems = 
     Async.Parallel [for item in items -> async { return someTask item }] 
     |> Async.RunSynchronously 

[<EntryPoint>] 
let main args = 
    ParallelExample.getComputedItems |> ignore 
    0 

は、次のような出力を持っている:

heh 
oh god why 
oh god why 
oh god why 
that's ok 
that's ok 
that's ok 

私はなぜF#がSequentialExampleモジュールでコードを実行されている、ParallelExampleモジュールを呼んでいる場合は?

私は間違っていますか?

(親愛なるStackOverflowのは、言って停止「あなたのポストはほとんどのコードであるように見えます;いくつかの詳細を追加してください」、私の質問に十分な詳細を持っている)

+2

本質的に、ある時点でコンパイラが 'let a = ...'のようなものを見た場合、それはmystの値を計算します。 –

+0

F#コンパイラがこのように動作する理由を知っていますか? – Gabriel

+1

それはある時点でそれを計算しなければならず、スタートが最適な時間です。これはどこかの仕様ですべて定義されることになっています –

答えて

7

ジョン・パーマーがコメントで言ったように、 let getComputedItems = ... が実際にあります値は関数ではなく、です。関数は引数を取らなければならないためです。

これを関数にするには、 let getComputedItems() = ...のように宣言する必要があります。

+1

...または 'let getComputedItems = ... fun() - > ...' – Jay

関連する問題