我希望有人能对Data.Reflection中的黑魔法有所了解。相关的片段是:
{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE KindSignatures #-}
module Data.Reflection
(
Reifies(..)
, reify
) where
import Data.Proxy
import Unsafe.Coerce
class Reifies s a | s -> a where
-- | Recover a value inside a 'reify' context, given a proxy for its
-- reified type.
reflect :: proxy s -> a
newtype Magic a r = Magic (forall (s :: *). Reifies s a => Proxy s -> r)
-- | Reify a value at the type level, to be recovered with 'reflect'.
reify :: forall a r. a -> (forall (s :: *). Reifies s a => Proxy s -> r) -> r
reify a k = unsafeCoerce (Magic k :: Magic a r) (const a) Proxy
- 我无法解析
reify
. 也许我错过了一些关于评估顺序的简单信息,但它看起来unsafeCoerce::a->b
适用于三个参数。 - 中使用的同构类型是
unsafeCoerce
什么? k
在 的定义中实际评估的函数在哪里reify
?哪里有任何实例
Reifes
?例如,我可以在 GHCi 中运行以下行,仅加载 Data.Reflection 和 Data.Proxy(并设置 -XScopedTypeVariables):。reify (3::Int) (\(_:: Proxy q) -> print $ reflect (Proxy :: Proxy q))
幻影实体化类型在哪里/什么?
- 什么是“魔法”
newtype Magic
?