Haskell F中的复制项等价#

Haskell F中的复制项等价#,haskell,f#,Haskell,F#,F#中的replicitem(属于Haskell)是否有任何等效函数 例如: replicateM 2 [1,2,3] = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]] 您可以在中找到它,它是为列表和序列定义的: #r@“c:\packages\FSharpPlus-1.0.0\lib\net45\FSharpPlus.dll” 开放式FSharpPlus 列表2[1;2;3] //val it:列表= // [[1; 1]

F#
中的
replicitem
(属于
Haskell
)是否有任何等效函数

例如:

replicateM 2 [1,2,3] = 
[[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]
您可以在中找到它,它是为
列表
序列
定义的:

#r@“c:\packages\FSharpPlus-1.0.0\lib\net45\FSharpPlus.dll”
开放式FSharpPlus
列表2[1;2;3]
//val it:列表=
//  [[1; 1]; [1; 2]; [1; 3]; [2; 1]; [2; 2]; [2; 3]; [3; 1]; [3; 2]; [3; 3]]
序号2[1;2;3]
//val it:序列列表=
//[seq[1;1];seq[1;2];seq[1;3];seq[2;1];seq[2;2];seq[2;3];
//序号[3;1];序号[3;2];序号[3;3]]
如果您是从Haskell进行翻译,则该函数和其他Haskell绑定与.Haskell模块是兼容的

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

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 }
让复制项n x=
让k m'=List.collect(乐趣x->
列表。收集(乐趣xs->
[List.Cons(x,xs)])m')m
List.foldBack k(List.replicate nx)[[]]

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

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 }

我现在的问题是在使用replicateM获得的序列上使用find操作符。但是似乎在序列上没有定义find(=m)。。在F#中是否有其他返回列表的replicateM实现。让replicateM'(n:int)source=Seq.toList(replicateM n source)正常工作