2016-05-20 7 views
2

ofListの機能がofSeqを超える理由はありますか?リストを他のコレクションタイプに変換していますか?Seq関数とofList関数の違いは何ですか?

+1

例を挙げてこれを明確にすることはできますか? – s952163

+1

@GuyCoder 'ofList'は" to toList "ではなく、" List to x "です。 – sepp2k

+1

どちらが機能しますか? 'Array.ofList'? 'Set.ofList'? 'Map.ofList'? 'Array.ofSeq'? 'Set.ofSeq'? 'Map.ofSeq'? 'List.ofSeq'? 'Seq.ofList'? –

答えて

3

各アプローチ間にパフォーマンスの差がありますが、通常はより優れた結果を得るために特殊化されたコンバージョンが期待されます。例を与えるために

Array.ofListは、この機能(https://github.com/fsharp/fsharp/blob/37a100b7caafde0f4df5a1924c9f65f4a18277a8/src/fsharp/FSharp.Core/local.fs#L300)を介して実装されている:Seq.toArrayスルー

let toArray (l:'T list) = 
    let len = l.Length 
    let res = arrayZeroCreate len 
    let rec loop i l = 
     match l with 
     | [] ->() 
     | h::t -> 
      res.[i] <- h 
      loop (i+1) t 
    loop 0 l 
    res 

Array.ofSeqながら作品(https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs#L1231):

let toArray (source : seq<'T>) = 
    checkNonNull "source" source 
    match source with 
    | :? ('T[]) as res -> (res.Clone() :?> 'T[]) 
    | :? ('T list) as res -> List.toArray res 
    | :? ICollection<'T> as res -> 
     // Directly create an array and copy ourselves. 
     // This avoids an extra copy if using ResizeArray in fallback below. 
     let arr = Array.zeroCreateUnchecked res.Count 
     res.CopyTo(arr, 0) 
     arr 
    | _ -> 
     let res = ResizeArray<_>(source)     
     res.ToArray() 

注意そのしかし、この場合、 ofSeq関数は、実際に供給されたシーケンスが実際にはlistであるかどうかをチェックし、そうであれば特殊な変換を使用しますn。

+0

変換のためにSeq関数を優先するのは安全ですか(実際に型をチェックして特殊な変換を選択する場合)?ベストプラクティスは何ですか? – SetyCZ

+1

@SetyCZそれを使用するのは安全ですが、私はそれを好むことをお勧めしません。たとえば、カスタムコレクションを使って作業していた場合、これらの余分なチェックが行われない可能性があるので、適切な習慣をつけるのが最善だと思います。また、より専門的な変換を使用することが適切であるとすれば、より慣用的であり、他の人があなたのコードを一目で読み取ることが容易になると思います。 – TheInnerLight

関連する問題