5

レポートのリストが欲しいのですが。レポートは、詳細タイプまたはセクションタイプのいずれかになります。

module Data

type Section = { Header: string;
                 Lines:  string list;
                 Total:  string }

type Detail = { State:     string;
                Divisions: string list;
                Sections:  Section list }

type Summary = { State:    string;
                 Office:   string;
                 Sections: Section list }

type Report = Detail | Summary

次に、私のコードで、次のことを実行したいと思います。

let mutable (reports:Report list) = []

...

reports <- detail::reports
// or
reports <- summary::reports

コンパイラは、最初のケースで「式はReport型であると予想されていましたが、ここではDetail型である」と文句を言い、2番目のケースでも同様に文句を言います。

そんなことをしたいと思っているのでしょうか。問題について別の考え方をする必要がありますか?レポートは詳細または要約のいずれかであるため、レポートのリストは詳細または要約のいずれかを受け入れるべきではありませんか?詳細または要約のリストではない場合、レポートリストとは何ですか?

ありがとう。

4

2 に答える 2

7

構文が少し間違っています:

type Report = Detail of Detail | Summary of Summary

reports <- (Detail detail)::reports
// or
reports <- (Summary summary)::reports

コードでは、基本的に、タイプを2つの可能な値または(これらはラベルのようなものであり、このコンテキストの異なるサブタイプのタイプではない)Reportを持つ列挙型として定義しました。F#で識別された共用体は明示的にタグ付けされているため、共用体コンストラクターの1つを使用して、リストに入れるインスタンスを作成する必要もあります。DetailsSummary

于 2012-12-07T21:13:27.950 に答える
3

Reportタイプを次のように変更する必要があります。

type Report = Detail of Detail | Summary of Summary

現在の定義では、レポートタイプの2つのケースに名前を付けるだけであり、これらの名前は既存のタイプDetailSummaryタイプに関連していないためです。

次に、たとえばを使用して要素Detailと要素をフィルタリングできます。SummaryList.choose

let details = reports |> List.choose (function Detail(d) -> Some(d) | _ -> None)
于 2012-12-07T21:17:07.710 に答える