4

私は2つのインターフェースを持っています: IStateIAction。Stateには、GetActionsというメソッドがあります。これはIActionのコレクションを返します。アクションには次のメソッドがあります。Apply-状態に作用して、新しい状態を返します。

IStateは、getアクションで返すアクションの種類を制御するためにtypeパラメーターを取り、IActionは、アクションできる状態の種類を制御するためにtypeパラメーターを取ります。(並べ替え、実装)。州が同じタイプの州に作用できる行動のみを返すことを保証できるようにしたいと思います。

type IAction<'S when 'S:>IState> =
    abstract member Apply : 'S->'S

and IState<'A when 'A:>IAction<'S when 'S:> typeof(this)>> = 
    abstract member GetActions : seq<'A>

しかし、明らかにtypeof(this)問題ではありません。タイプパラメータが定義しているタイプと同じタイプであることを確認するために、タイプ制約を設定するにはどうすればよいですか?

4

1 に答える 1

5

そもそも問題に巻き込まれないようにするための解決策

あなたの質問に対する直接の答えではありませんが、それはあなたの元の問題を解決するはずです:

type StateMachine<'State, 'Action> =
    interface
        abstract Apply : 'State * 'Action -> 'State
        abstract GetActions : 'State -> 'Action seq
    end

この問題への取り組み方は、MLのモジュールシステムに触発されています

醜い解決策

緊密に結合された2つのインターフェースを本当に使いたい場合は、次のようにすることができます。

type IState<'Action, 'State when 'Action :> IAction<'State, 'Action> and 'State :> IState<'Action, 'State>> =
    interface
        abstract GetActions : unit -> 'Action seq
    end

and IAction<'State, 'Action when 'Action :> IAction<'State, 'Action> and 'State :> IState<'Action, 'State>> =
    interface
        abstract Apply : 'State -> 'State
    end

// Some stupid types to illustrate how to implement the interfaces
type State() =
    interface IState<Action, State> with
        member this.GetActions() = Seq.empty

and Action() =
    interface IAction<State, Action> with
        member this.Apply s = s

人々が2番目のソリューションを使い始めて、それから私にちなんで名付けられたデザインパターンを作成しないことを願っています:)

于 2012-05-05T09:36:12.430 に答える