2

タプルのシーケンスを csv に書き込もうとしていますが、通常の File.WriteAllLines はタプルのシーケンスによってオーバーロードされています。

したがって、タプルを一連の文字列にフラット化しようとしました。

これが私のコードです:-

open System;;
open Microsoft.FSharp.Reflection;;

let tupleToString (t: string * float) = 
        if FSharpType.IsTuple(t.GetType()) 
        then String.Format("{0},{1}", fst t, snd t)
        else "";;

    let testTuple = ("monkey", 15.168);;

    tupleToString(testTuple);;

let testSeqTuple = [("monkey", 15.168); ("donkey", 12.980)];;

let allIsStrings (t:seq<string * float>) = Seq.collect tupleToString t;;

allIsStrings(testSeqTuple);;

1 つのタプルだけで「tupleToString」を使用すると、結果は問題ありません。

ただし、allIsStrings の Seq.collect 部分は、文字ごとに分類されたタプルを返します。

Seq.choose と Seq.fold も試しましたが、これらは単純にエラーをスローします。

シーケンスモジュールのどの関数を使用する必要があるか、またはタプルで機能する File.WriteAllLines の代替案についてアドバイスできますか?

4

2 に答える 2

10

Seq.mapリストのすべての要素をに変換してから、string渡すArray.ofSeqことができる配列を取得するためにを使用する必要がありWriteAllLinesます。

let allIsStrings (t:seq<string * float>) = 
  t |> Seq.map tupleToString
    |> Array.ofSeq

また、tupleToString関数では、引数がタプルであることを確認するためにリフレクションを使用する必要はありません。これは型システムによって保証されているため、常にタプルになります。だからあなたはただ書くことができます:

let tupleToString (t: string * float) = 
  String.Format("{0},{1}", fst t, snd t)      

任意の数のパラメーターを持つタプルに対してこれを機能させたい場合は、リフレクションを使用できます(ただし、これはより高度なトピックです)。以下は、タプルの要素を取得し、それらをすべて文字列に変換してから、コンマを使用して連結します。

let tupleToString t = 
  if FSharpType.IsTuple(t.GetType()) then
    FSharpValue.GetTupleFields(t)
    |> Array.map string
    |> String.concat ", "
  else failwith "not a tuple!"

// This works with tuples that have any number of elements
tupleToString (1,2,"hi")
tupleToString (1.14,2.24)

// But you can also call it with non-tuple and it fails
tupleToString (new System.Random())
于 2012-10-25T15:33:30.630 に答える
5

受け入れられた答えははるかに優れていますが、私は今これを書いたので、そこにあります。

let testSeqTuple = [("monkey", 15.168); ("donkey", 12.980)]

let tupleToString t = String.Format("{0},{1}", fst t, snd t)
let tuplesToStrings t = Array.ofSeq (Seq.map tupleToString t)

for s in tuplesToStrings(testSeqTuple) do
    printfn "s=#%s" s
于 2012-10-25T15:49:24.287 に答える