是否可以写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
但是它不起作用。
答案 0 :(得分:8)
否,这是不可能的(除了this one by melpomene之类的“琐碎”实现会完全忽略该参数之外)。
类型Proxy a
的值在运行时携带的信息不比()
携带的信息多,也就是说,它根本不携带任何信息。无论a
是什么,都是如此。
在运行时,您的类型T
携带的信息不只是()
:它携带了Show
方法字典,用于某种类型的字典。该字典不是很有用,因为在解压缩存在性时,您没有任何方法可以获取类型t
的值来使用show
,但是从技术上讲,该信息在那里
由于构造T
要求提供类型类字典,但是Proxy T
内不存在该字典(也不提供获取它的任何手段),并且没有关于该字典类型的静态信息应该是因为,不可能获得构造T
所必需的字典。换句话说,构造类型Proxy T
的值不会选择t
— T
的{{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)