7

差別化された共用体とレコード型について頭を悩ませようとしています。具体的には、読みやすくするためにそれらを組み合わせる方法。以下に例を示します。たとえば、スポーツ チームがポイント (リーグ ポイントと得失点差の両方) を獲得するか、ポイントまたは得失点差のないリーグから一時停止される可能性があるとします。それを表現しようとしたのが以下の方法です。

type Points = { LeaguePoints : int; GoalDifference : int }

type TeamState = 
    | CurrentPoints of Points
    | Suspended

type Team = { Name : string; State : TeamState }

let points = { LeaguePoints = 20; GoalDifference = 3 }

let portsmouth = { Name = "Portsmouth"; State = points }

問題は、'State = points' と言っている最後の行の最後にあります。「式は TeamState 型であることが期待されていましたが、ここでは Points 型です」と表示されます。どうすればそれを回避できますか?

4

2 に答える 2

16

パッドの回答に詳細を追加するために、最初のバージョンが機能しなかった理由は、割り当てられたState値のタイプが type の識別されたユニオン値でなければならないためTeamStateです。あなたの表現では:

let portsmouth = { Name = "Portsmouth"; State = points }

... のタイプはpointsですPoints。pad によって投稿されたバージョンでは、式CurrentPoints pointsは のコンストラクターを使用して、TeamStateを表す判別共用体値を作成しますCurrentPoints。ユニオンが提供する他のオプションは で、次のSuspendedように使用できます。

let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points }
let portsmouth = { Name = "Portsmouth"; State = Suspended }

コンストラクターの名前を使用しなかった場合、中断されたチームをどのように構築するかは明確ではありません!

最後に、すべてを 1 行で書くこともできますが、それでは読みにくくなります。

let portsmouth = 
  { Name = "Portsmouth"
    State = CurrentPoints { LeaguePoints = 20; GoalDifference = 3 } }
于 2012-04-12T16:12:55.447 に答える
6
let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points }
于 2012-04-12T16:02:31.020 に答える