あなたはsignature fileで上記の状態マシンをカプセル化することができます。つまり、これらの型の値を直接作成することはできません。これは、例えば、コンパイルされません。
let g = BlackJack.Game []
与えられたエラーは次のとおりです。
エラーFS0039:値、コンストラクタ、名前空間または型 'ゲーム' の
が定義されていません。 Game
値を作成する唯一の方法は、それを作成する関数を呼び出すことです:
let g =
BlackJack.init
{ Face = Ace; Suit = Spades }
{ Face = King; Suit = Diamonds }
あなたは上記の署名ファイルもGame
とDeal
値のうち、カードを取得するために2つの関数を定義していることに気づいたかもしれ let g' = BlackJack.hit g { Face = Two; Suit = Spades }
:
これはまた、あなたがゲームを継続することができます。ここでの実装は以下のとおりです。
let card = function
| Hand (c1, c2) -> [c1; c2]
| Hit c -> [c]
let cards (Game deals) = List.collect card deals
クライアントは、このようにそれらを使用することができます。このアプローチは、ほとんどの構造であることを
> let cs = g' |> BlackJack.cards;;
>
val cs : Card list = [{Suit = Spades;
Face = Two;};
{Suit = Spades;
Face = Ace;};
{Suit = Diamonds;
Face = King;}]
は注意してください。可動部分はほとんどありません。
付録
これらは、上記で使用したファイルです:
Cards.fs:
namespace Ploeh.StackOverflow.Q34042428.Cards
type Suit = Diamonds | Hearts | Clubs | Spades
type Face =
| Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
| Jack | Queen | King | Ace
type Card = { Suit: Suit; Face: Face }
ブラックジャック。FSI:
module Ploeh.StackOverflow.Q34042428.Cards.BlackJack
type Deal
type Game
val init : Card -> Card -> Game
val hit : Game -> Card -> Game
val card : Deal -> Card list
val cards : Game -> Card list
BlackJack.fs:
module Ploeh.StackOverflow.Q34042428.Cards.BlackJack
open Ploeh.StackOverflow.Q34042428.Cards
type Deal = Hand of Card * Card | Hit of Card
type Game = Game of Deal list
let init c1 c2 = Game [Hand (c1, c2)]
let hit (Game deals) card = Game (Hit card :: deals)
let card = function
| Hand (c1, c2) -> [c1; c2]
| Hit c -> [c]
let cards (Game deals) = List.collect card deals
Client.fs:
module Ploeh.StackOverflow.Q34042428.Cards.Client
open Ploeh.StackOverflow.Q34042428.Cards
let g =
BlackJack.init
{ Face = Ace; Suit = Spades }
{ Face = King; Suit = Diamonds }
let g' = BlackJack.hit g { Face = Two; Suit = Spades }
let cs = g' |> BlackJack.cards
おかげマーク。 fsiファイルで、外部から「ゲーム」を明示的に有効にしたければ、それをどのように表現しますか?それはfsiファイル内の "type game()"だけでしょうか? –
@ScottNimrodこれを行うには、通常のモジュール宣言が有効なので、最も簡単な方法は '.fsi'ファイルを削除することです。それ以外の場合は、[ドキュメント](https://msdn.microsoft.com/en-us/library/dd233196.aspx)でその方法を教えてください。 –