私はF#とアクティブなパターンにかなり慣れていないので、説明できない異常に遭遇しました。
module Eval =
let (|Bet|Pass|) (test:BetChoice) =
match test with
| BetChoice.Bet -> Bet
| BetChoice.Pass -> Pass
let (|NoBet|Bet|Pass|) (test:Nullable<BetChoice>) : Choice<unit, unit, unit> =
match test.HasValue with
| true -> match test.Value with
| BetChoice.Bet -> Bet
| BetChoice.Pass -> Pass
| false -> NoBet
let FlipByWinner ((value:int), (awins:bool)) =
match awins with
| true -> (value, -value)
| false -> (-value, value)
let Evaluation (awins:bool) (player11:BetChoice) (player21:BetChoice) (player12:Nullable<BetChoice>) =
match player11 with
| Pass -> match player21 with
| Pass -> FlipByWinner(1, awins)
| Bet-> match player12 with
| Bet -> FlipByWinner(2, awins)
| Pass -> FlipByWinner(1, false)
| NoBet -> raise (System.ArgumentException("invalid strategy"))
| Bet -> match player21 with
| Bet -> FlipByWinner (2, awins)
| Pass -> FlipByWinner (1, false)
これはコンパイルされません。微調整を加えるだけで意図したとおりに機能させることができますが、何が起こっているのか正確にわからないため、少し緊張します...2番目のパターンの名前を「(| NoBet | Bet1 | Pass1 | )」と関連するパターンがコード全体で変更された場合、それは機能しますが、これに型の不一致の例外がある理由はわかりません。
また、ほとんど同じであるが完全ではない2つのアクティブなパターンを処理する良い方法はありますか?一般的なものを一緒に因数分解する方法があるはずのようです。(補足として、コピー/貼り付けでインデントが台無しになっているように見えます。これはすべてモジュールEvalの一部です)。