gpt4 book ai didi

f# - F#列表选择很多

转载 作者:行者123 更新时间:2023-12-03 09:06:20 24 4
gpt4 key购买 nike

这是一个非常简单的问题,但我没有找到答案:

F#中是否有任何Seq / List操作与LINQ SelectMany相匹配?

  • 我知道如果我可以在F#中使用System.Linq
    想要。
  • 我知道我可以做一个递归方法
    并使用F#计算表达式
    (并使功能更强大)。

  • 但是,如果我试图证明F#List操作比LINQ更强大...
  • .Where = List.filter
  • 。选择= List.map
  • .Aggregate = List.fold
  • ...

  • 在C#中,SelectMany的用法非常简单:
    var flattenedList = from i in items1
    from j in items2
    select ...

    是否有任何简单的直接匹配项,List.flatten,List.bind或类似的东西?

    SelectMany有几个签名,但是最复杂的签名似乎是:
    IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TCollection>> collectionSelector,
    Func<TSource, TCollection, TResult> resultSelector
    );

    用F#术语表示为:
    ('a -> 'b list) -> ('a -> 'b -> 'c) -> 'a list -> 'c list

    最佳答案

    collect是SelectMany的F#等效项,但是它不提供所有重载。这是制作引用文献的方法。

    let selectMany (ab:'a -> 'b seq) (abc:'a -> 'b -> 'c) input =
    input |> Seq.collect (fun a -> ab a |> Seq.map (fun b -> abc a b))
    // gives
    // val selectMany : ('a -> seq<'b>) -> ('a -> 'b -> 'c) -> seq<'a> -> seq<'c>

    我相信F#不会提供所有SelectMany重载,因为它们会给库增加噪音。这是Microsoft命名中 SelectMany的所有四个重载。
    let selectMany (source : 'TSource seq) (selector : 'TSource -> 'TResult seq) =
    source |> Seq.collect selector

    let selectMany (source : 'TSource seq) (selector : 'TSource -> int -> 'TResult seq) =
    source |> Seq.mapi (fun n s -> selector s n) |> Seq.concat

    let selectMany (source : 'TSource)
    (collectionSelector : 'TSource -> 'TCollection seq)
    (resultSelector : 'TSource -> 'TCollection -> 'TResult) =
    source
    |> Seq.collect (fun sourceItem ->
    collectionSelector sourceItem
    |> Seq.map (fun collection -> resultSelector sourceItem collection))

    let selectMany (source : 'TSource)
    (collectionSelector : 'TSource -> int -> 'TCollection seq)
    (resultSelector : 'TSource -> 'TCollection -> 'TResult) =
    source
    |> Seq.mapi (fun n sourceItem ->
    collectionSelector sourceItem n
    |> Seq.map (fun collection -> resultSelector sourceItem collection))
    |> Seq.concat

    “F#列表操作比LINQ更强大...”尽管seq / list操作非常有用,但 Function CompositionCurrying却产生了一些真正的“F#力量”。
    // function composition
    let collect selector = Seq.map selector >> Seq.concat

    关于f# - F#列表选择很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599657/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com