【问题标题】:cons :: operator for sequences in F#?F# 中序列的 ​​cons :: 运算符?
【发布时间】:2012-03-01 16:18:30
【问题描述】:

有没有更好的代码不需要把序列转成列表?

let rec addentry map keys  =
   match keys with 
   | ((i,j) :: tail) ->  Map.add (i,j) ((inputd.[i]).[j]) (addentry map tail)
   | ([]) -> map

addentry Map.empty (Cartesian keys1 keys2 |> Seq.toList)

【问题讨论】:

    标签: f# sequence cons cdr


    【解决方案1】:

    这是使用Seq.fold 的好地方。它将集合折叠成单个值。

    Cartesian keys1 keys2
    |> Seq.fold (fun map (i, j) ->
      let value = (inputd.[i]).[j]
      Map.add (i, j) value map) Map.empty
    

    【讨论】:

    • 我才意识到这一点。我不知道我的头在哪里。
    【解决方案2】:
    Cartesian keys1 keys2
    |> Seq.map (fun (i, j) -> ((i, j), (inputd.[i]).[j]))
    |> Map.ofSeq
    

    【讨论】:

      【解决方案3】:

      作为对前面答案的补充,如果您希望能够对序列进行模式匹配,您可以定义一个活动模式:

      let (|Cons|Nil|) s =
          if Seq.isEmpty s then
              Nil
          else
              Cons(Seq.head s, Seq.skip 1 s)
      
      let rec addentry map keys  =
          match keys with 
          | Cons((i,j), tail) ->  Map.add (i,j) ((inputd.[i]).[j]) (addentry map tail)
          | Nil -> map
      

      【讨论】:

      • 遗憾的是,这种活动模式似乎比列表的 cons 运算符慢几个数量级。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2010-10-27
      • 2010-09-08
      相关资源
      最近更新 更多