2011-12-06 69 views
2

我正在學習F#。最近,我讀到了有關.NET 4.5關於任務的改進。 因此,我深入瞭解瞭如何在F#中使用它。 In fsi:如何在F#中使用System.Threading.Tasks?

use System.Threading.Tasks 
Parallel.ForEach([1;2],fun x->x+1);; 

給出了很多錯誤。

另外,在Fsharp core lib的源代碼中。我看到:

module Parallel = 
open System.Threading.Tasks 

[<CompiledName("Choose")>] 
let choose f (array: 'T[]) = 
    checkNonNull "array" array 
    let inputLength = array.Length 
    let lastInputIndex = inputLength - 1 

    let isChosen : bool [] = //(Deliberately offside to avoid scrollbars) 
     Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked inputLength 
    let results : 'U [] = 
     Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked inputLength 

但是,我無法使用Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked。爲什麼? 我:

錯誤FS1092:類型「陣」是不是從這個代碼 位置訪問。

回答

8

您使用ForEach方法令人困惑,因爲您的lambda函數返回結果。 ForEach操作可用於對來自輸入的所有元素執行一些命令行動,所以lambda函數應該返回unit。下面將正常工作:

open System.Threading.Tasks 

Parallel.ForEach([1;2], fun x-> 
    printfn "%d" (x+1)) |> ignore 

我還添加了ignore,因爲ForEach返回一些值,結果(我們不使用它)。

關於F#核心庫的代碼 - 該代碼被編譯爲F#核心庫的一部分,所以它可以使用未公開API中暴露了一些內部功能,所以你不能使用它們。在你的情況下,你需要使用Array.zeroCreate而不是Array.zeroCreateUnchecked