从代理中提取存在性

时间:2018-11-16 16:57:02

标签: haskell existential-type

是否可以写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

但是它不起作用。

3 个答案:

答案 0 :(得分:8)

否,这是不可能的(除了this one by melpomene之类的“琐碎”实现会完全忽略该参数之外)。

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

在运行时,您的类型T携带的信息不只是():它携带了Show方法字典,用于某种类型的字典。该字典不是很有用,因为在解压缩存在性时,您没有任何方法可以获取类型t的值来使用show,但是从技术上讲,该信息在那里

由于构造T要求提供类型类字典,但是Proxy T内不存在该字典(也不提供获取它的任何手段),并且没有关于该字典类型的静态信息应该是因为,不可能获得构造T所必需的字典。换句话说,构造类型Proxy T的值不会选择tT的{​​{1}}内没有类型—因为Proxy T仅包含类型级别的信息,但是Proxy类型内部的t仅存在于值级别。

答案 1 :(得分:3)

const express = require('express');
const bodyParser = require('body-parser');
const logger = require('morgan');
const http = require('http');
const path = require('path');

const app = express();

app.use(logger('dev'));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

const port = process.env.PORT || 8000;

const server = http.createServer(app);

var options = {
  host: 'bluebirdpages.olk.net/',
  path: '/login',
  method: 'POST'
}

http.request(options, callback);

app.use(express.static(path.join(__dirname, 'client/build')));

require('./server/routes')(app);

app.get('*', (req, res) => res.status(200).send({
  message: 'Welcome'
}));

server.listen(port);

module.exports = app;

我不确定这有什么用(或如何“提取”任何东西),但是它具有必需的类型签名。

答案 2 :(得分:1)

这是不可能的。来自documentation

  

Proxy是不包含数据的类型

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