从代理中提取存在性
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
值。
可以写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
值。