我正在学习F#。最近,我读到了.NET 4.5关于任务的改进。 所以,我看了一下如何在F#中使用它。 在fsi:
use System.Threading.Tasks
Parallel.ForEach([1;2],fun x->x+1);;
给出了很多错误。
另外,在Fsharp核心库的源代码中。我看到了:
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:无法从此代码访问“Array”类型 位置。
答案 0 :(得分: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
。