Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从代理中提取存在句_Haskell_Existential Type - Fatal编程技术网

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中没有类型。谢谢,现在我明白了