多くの制約が集まっているようです。これらを抽象化しましょう。制約ファミリのための基礎知識
type MonadNumState a m = (MonadState a m, Num a)
MonadNumState
だけ制約同義語であるので、私は使用するたびに関数従属性の利益を得る、そして簡単にコンテキストにMonadNumState a m
を投げることができます。
class Iterator t where
type MonadIter t a m :: Constraint
next :: (MonadIter t a m) => m t
...
instance Iterator Foo where
type MonadIter Foo a m = (MonadState a m, Num a)
...
instance Iterator Bar where
type MonadIter Bar a m = (MonadRandom m, MonadSplit a m, RandomGen a)
...
しかし、今a
は機能的依存関係ではありません。今、私は制約家族にこの抽象したいとします。 a
は推測できないため、next
は事実上使用できません。私に何ができる?もちろん、代わりにタイプファミリーを使用することもできます。 MonadState
はfundepsを使って書かれていますが、基底系を型族に変換するのは簡単です。
instance (MonadState s m) => MonadStateFamily m where
type St m = s
get' = get
...
instance (MonadStateFamily m) => MonadState (St m) m where
get = get'
...
Foo.hs:25:3:
The RHS of an associated type declaration mentions type variable `s'
All such variables must be bound on the LHS
ほかに何ができるでしょうか?私が本当に望んでいるのは、現実的に離れて数値化することです。s
。明示的な辞書を渡すことなくこれを行う方法は見つけられていません。
したがって、どのように制約ファミリのための資金の利益を得ることができますか?