Haskell 从代理中提取存在句
是否可以写入Haskell 从代理中提取存在句,haskell,existential-type,Haskell,Existential Type,是否可以写入extract {-# 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 ->
extract
{-# 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 ())
我不确定这有多有用(或者它是如何“提取”任何内容的),但它具有所需的类型签名。不,这是不可能的(除了像这样的“琐碎”实现,完全忽略参数)
Proxy A
类型的值在运行时携带的信息不比()
类型的值多,也就是说它根本不携带任何信息。无论a
是什么,这都是正确的
您的类型T
在运行时携带的信息不仅仅是()
:它还携带了一个Show
方法字典,用于周围的某些类型。这本词典不是很有用,因为在解包存在主义时,您没有任何方法获得类型为t
的值来使用show
on,但从技术上讲,这些信息是存在的
由于构造
T
需要提供类型类词典,但词典(或获取词典的任何方法)不存在于代理T
中,并且没有关于词典应用于哪种类型的任何静态信息,因此不可能获取构造T
所需的词典。换句话说,构造类型为Proxy T
的值不会选择T
-在Proxy T
中的T
内没有类型-因为Proxy
只携带类型级别的信息,但是t
类型中的t
仅存在于值级别。这是不可能的。从:
Proxy
是一种不包含数据的类型
除了类型之外,您无法从
代理
值中提取任何内容。类型Proxy T
没有说明T
值中的类型,因为里面没有T
值。我希望在Proxy T
和T
中有相同的类型,例如p=Proxy::Proxy(T(Proxy::Proxy String))
并且我希望得到extract p=T(Proxy::Proxy String)
@ПццБззццццц)Proxy T中没有类型。谢谢,现在我明白了