从代理中提取存在性

Extracting existential from proxy

可以写extractT吗?

{-# LANGUAGE ExistentialQuantification #-}
import Data.Proxy

data T = forall t. Show t => T (Proxy t)

extractT :: Proxy T -> T
extractT p = ...

我试过了

extractT p = T $ p >>= \(T t) -> t

但是没用。

extractT :: Proxy T -> T
extractT _ = T (Proxy :: Proxy ())

我不确定这有多大用处(或者它有什么用 "extracting"),但它具有所需的类型签名。

不,这是不可能的(除了像 这样完全忽略参数的“微不足道”的实现)。

Proxy a 类型的值在运行时携带的信息不比 () 多,也就是说它根本不携带任何信息。无论 a 是什么,都是如此。

您的类型 T 在运行时包含的信息不仅仅是 ():它包含一个 Show 方法字典,用于某些类型。这本字典不是很有用,因为在解压缩存在性时,您无法获得类型 t 的值以在 show 上使用,但从技术上讲,信息在那里.

由于构建 T 需要提供一个类型类字典,但是 Proxy T 中不存在该字典(也没有任何获取它的方法),并且没有关于哪种类型的任何静态信息字典应该是for,不可能获取构造一个T所必需的字典。换句话说,构造 Proxy T 类型的值不会选择 t——Proxy T 中的 T “内部”没有类型——因为 Proxy仅携带类型级别的信息,但 T 类型中的 t 仅存在于值级别。

这是不可能的。来自 documentation:

Proxy is a type that holds no data

除了类型之外,您无法从 Proxy 值中提取任何内容。而类型 Proxy T 并没有说明 T 值内的类型,因为里面有 no T 值。