Projecting a list of lists efficiently in F#

后端 未结 5 633
太阳男子
太阳男子 2020-12-03 08:47

I have to do projection of a list of lists which returns all combinations with each element from each list. For example:

projection([[1]; [2; 3]]) = [[1; 2]         


        
5条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-03 08:56

    This function is Haskell's sequence (although sequence is more generic). Translating to F#:

    let sequence lss =
        let k l ls = [ for x in l do for xs in ls -> x::xs ]
        List.foldBack k lss [[]]
    

    in interactive:

    > test projection 10;;
    Real: 00:00:12.240, CPU: 00:00:12.807, GC gen0: 163, gen1: 155, gen2: 4
    val it : int = 3628800
    > test sequence 10;;
    Real: 00:00:06.038, CPU: 00:00:06.021, GC gen0: 75, gen1: 74, gen2: 0
    val it : int = 3628800
    

    General idea: avoid explicit recursion in favor to standard combinators (fold, map etc.)

提交回复
热议问题