1

異なるタイプの配列の識別結合がある場合、それらを「実際の」タイプに変換するにはどうすればよいですか?

type ItemStuff = 
   | Colors of string[]
   | Sizes of int[]

let foo = Sizes [|1;2;3|]

foo の値を取得したときに上記を実行すると、次のように表示されます。

val foo : ItemStuff = Sizes [|1;2;3|]

foo から int の実際の配列を取得するにはどうすればよいですか? のようなものにアクセスできる構文が欠けているだけ foo.[2]ですか? foo で列挙できないため、マップを使用できませんでした。返される配列の異なる型ごとに適切に型指定された配列を返す ItemStuff のメンバーを作成できますが、それは正しくないように思えましたか?

ここで私の最善のアプローチは何ですか?

これが私がやったことです。それを行うためのより良い方法についてのアイデアはありますか?

type ItemProp =
| Colors of string[]
| Sizes of int[]
| Quants of int[]
member this.GetColors() =
   match this with
   | Colors (stringArray) ->
       stringArray
   | _ -> null
member this.GetIntArr() =
   match this with
   | Sizes (intArray) | Quants (intArray) ->
       intArray
   |_ -> null

foo.GetIntArr()
4

4 に答える 4

6

foo から int の実際の配列を取得するにはどうすればよいですか?

footype があると言われているだけなので、それが実際の問題ItemStuffです。したがって、値を含める必要はまったくありませんSizesColors

したがって、プログラムはここで決定する必要があります

let getIntArray = function
    | Sizes arr -> arr
    | Colors _  -> failwith "Given value doesn't contain an int array`

getIntArray foo正常に動作しますがgetIntArray (Colors [||])失敗しますが、型レベルからは両方とも有効です。

操作が成功することを完全に確信している場合は、パターン マッチングを直接使用できます。

let getIntArray (Sizes arr) = arr
于 2009-12-21T11:10:33.197 に答える
3

ItemStuffホールドが色やサイズを保持しているかどうかわからないため、通常はパターンマッチングを使用します。インスタンスがあることを確実に知っている場合はSizes、次のようなことができます。

let (Sizes arr) = foo

アレイを引き出します。

于 2009-12-21T14:02:27.600 に答える
2

どちらかまたは両方のシナリオ (色またはサイズ) を実際に表していない場合は、ここでRecord タイプを使用することを検討してください。

type ItemStuff = 
    { Colors : string[];
      Sizes : int[] } with
    static member Default = { Colors = [||]; Sizes = [||] }

let foo = { ItemStuff.Default with Sizes = [|1;2;3|] }
printfn "%A" foo.Colors    // [||]
printfn "%A" foo.Sizes     // [|1; 2; 3|]
printfn "%d" foo.Sizes.[2] // 3
于 2009-12-21T13:49:25.093 に答える
1

識別された共用体がでなかった場合は、Noneを指定してオプションタイプを返すこともできますSizes

let getIntArray item =
    match item with
    | Sizes(i) -> Some(i)
    | _        -> None

ただし、F#の最後で、関数は常に入力データ型を出力データ型に変換するか、関数が副作用(画面に何かを印刷したり、配列にデータを挿入したりする)を行うだけであることに注意してください。

したがって、たとえば、単にSizes(または、の場合は何もColors)印刷したくない場合は、その目的のために新しい関数を作成する方が短くなります。

let printSizes item =
    match item with
    | Sizes(i) -> printfn "%A" i
    | _        -> ()

それ以外の:

let getIntArray item =
    match item with
    | Sizes(i) -> Some(i)
    | _        -> None

let res = getIntArray foo

(function | Some(i) -> printfn "%A" i | _ -> ()) res
于 2009-12-21T11:49:04.203 に答える