繁体   English   中英

F#中的ReplicateM等效项

[英]ReplicateM Equivalent in F#

F#HaskellReplicateM是否具有任何等效功能?

范例:

replicateM 2 [1,2,3] = 
[[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]

您可以在F#+中找到它,并且为ListSeq定义了它:

#r @"c:\packages\FSharpPlus-1.0.0\lib\net45\FSharpPlus.dll"

open FSharpPlus

List.replicateM 2 [1;2;3]

// val it : List<int list> =
//  [[1; 1]; [1; 2]; [1; 3]; [2; 1]; [2; 2]; [2; 3]; [3; 1]; [3; 2]; [3; 3]]

Seq.replicateM 2 [1;2;3]
// val it : seq<int> list =
// [seq [1; 1]; seq [1; 2]; seq [1; 3]; seq [2; 1]; seq [2; 2]; seq [2; 3];
//   seq [3; 1]; seq [3; 2]; seq [3; 3]]

如果您是从Haskell进行翻译,则此项目中将包含一个Compatibility.Haskell模块,其中包含该功能和其他Haskell绑定。

实际上,最后一个参数可以是列表,也可以是其他任何Applicative,但是如果您不想使用该库,并且对仅适用于list的版本感到满意,则可以这样定义:

let replicateM n x = 
    let k m m' = List.collect (fun x -> 
        List.collect(fun xs -> 
            [List.Cons(x,xs)]) m') m       
    List.foldBack k (List.replicate n x) [[]]

该函数在标准库中不可用,因此,如果您不想依赖外部库,则需要自己编写。 最简单的实现如下所示:

let rec replicateM m l = seq {
  if m = 1 then 
    // If we want just one replication, generate singleton lists
    for v in l do yield [v]
  else 
    // Otherwise, iterate over all lists with m-1 replicates
    for s in replicateM (m - 1) l do
      // .. and append elements from 'l' to the front
      for v in l do yield v::s }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM