2014-05-14 2 views

답변

4

당신은 F#+에서 찾을 수 있으며 모두 ListSeq에 대해 정의 : 당신이 하스켈에서 번역하는 경우

#r @"C:\packages\FsControl.2.0.0-CI00073\lib\net40\FsControl.dll" 
#r @"C:\packages\FSharpPlus.1.0.0-CI00015\lib\net40\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]] 

Compatibility.Haskell 모듈이있다 그 함수와 다른 Haskell 바인딩들. 마지막 인수는 목록 또는 할 수있다 사실

다른 실용적 라이브러리를 사용하지 않고 당신이 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) [[]] 
1

이 기능은 표준 라이브러리에서 사용할 수 없으므로 외부 라이브러리를 사용하지 않으려면 직접 작성해야합니다. 가장 쉬운 구현은 다음과 같습니다.

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 } 
+0

문제는 replicateM을 사용하여 얻은 시퀀스에서 find 연산자를 사용하는 것입니다. 하지만 찾을 것입니다 (== m) 시퀀스에 정의되지 않은 것 같습니다. 목록을 반환하는 F #에서 replicateM의 다른 구현이 있습니까. –

+0

작동했습니다. replicateM '(n : int) source = Seq.toList (replicateM n source) –

관련 문제