我曾希望有人能夠在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
是什麼「魔法」?
我猜B.o.B. *是正確的。 – crockeea
我仍然在消化這個答案,但是我沒有看到任何關於他缺少'reflect'的實現。 – crockeea
查看4的結尾。我們'unsafeCoerce'是一個帶有一個約束和一個參數的函數,帶有兩個參數。 – shachaf