8
reflection
パッケージは反射リスクの不整合はありますか?
reify :: a -> (forall s . Reifies s a => Proxy s -> r) -> r
が与えられたクラス
class Reifies s a | s -> a where
reflect :: proxy s -> a
と機能を提供する唯一のこれらの、1でしむしろひどく、例えば、インスタンス
instance Reifies s Int where
reflect _ = 0
を与えることによって台無しに
、なぜなら例えば、
これは悪いだろうreify (1 :: Int) $ \p -> reflect p
は合法(reify
を適用する前に渡された関数を特化することにより)(通常の反射プロセスを介して)1又は0のいずれかを生成することができます。
Data.Reflection
には、実際には、このような悪用がブロックされているように見えます。Reifies
私が記述した悪のインスタンスは、重複として拒否されます。オーバーラップするインスタンスが有効になっている場合は、私は専門の重複がもたらす不確実性によってブロックされることがあります信じています。おそらくGADTsのヘルプまたは一部などで、日陰のインスタンスでこれを公開するいくつかの方法があるかどう
それでも、私は思ったんだけど。
GHCが上 'SPECIALIZE'を使用することによってだまさすることができれば、うーん...私は疑問に思います関数は最終的に 'reify'に渡されました。私は家に帰るときにそれを試みるつもりです。 – dfeuer
@dfeuerは、あなたはそれを試してみましたか? –