代码之家  ›  专栏  ›  技术社区  ›  em70

F和PLINQ扩展方法

  •  4
  • em70  · 技术社区  · 15 年前

    在深入研究最新发布的f时,我试图让它与plinq交互。 不过,我注意到,这两个人在代码方面不太擅长合作。 实际上,似乎不可能编写如下代码:

    
    open System.Linq
    let someArray = [|"abc"; "def"|]
    someArray.AsParallel().Count(new Func<_,_>(fun s -> s.Length = 3))
    

    因为包含在System.Linq.ParallelEnumerable类中的ParallelQuery扩展方法似乎没有被f_接受。
    如果根本不支持扩展方法,我不会感到惊讶,但是因为我可以访问为IEnumerable定义的someArray.Count扩展方法,我想知道为什么我不能访问plinq的方法。
    我错过什么了吗?
    这是F限制吗?如果是这样的话,是通过设计吗?如果没有,它会在将来的版本中被处理吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Ray Vernagus    15 年前

    如果尚未使用.NET 4.0,可以将其编写为:

    #r "System.Threading"
    open System.Linq
    
    let someArray = [|"abc"; "def"|]
    
    someArray.AsParallel<string>()
    |> Seq.filter (fun s -> s.Length = 3)
    |> Seq.length
    

    来吧.NET 4.0,你只需写:

    let someArray = [|"abc"; "def"|]
    
    someArray
    |> Array.Parallel.filter (fun s -> s.Length = 3)
    |> Array.length
    

    与LINQ扩展方法相比,F更喜欢使用Seq模块。但是,在fsharp.powerpack.linq程序集中有一些辅助函数可用。

        2
  •  1
  •   Noldorin    15 年前

    如果我没记错的话,让plinq和f很好地合作是微软开发团队的任务清单,尽管我不确定它会出现在.NET 4.0中。但是,F确实有 Asynchronous Workflows 这与plinq非常相似(只是它基于列表理解,这是标准的功能方式)。我似乎找不到在f_中提到对并行扩展(plinq/tpl)更好支持的文章,所以不要在上面引用我,但我肯定我在某个地方看到了它。

    除了MSDN页面之外, this article 这似乎是对这个话题的一个很好的介绍。

    还有 this blog series ( 在f中使用plinq# )如果您仍然喜欢使用PLINQ而不是异步工作流,那么阅读它可能很方便。

        3
  •  1
  •   Ganesh Sittampalam    15 年前

    扩展方法只是将对象作为第一个参数的静态方法,因此您应该能够使用

    ParallelEnumerable.AsParallel(someArray).Count(...)