我们的想法是通过只编写.cpp文件退出当前的.h/.cpp系统,然后在编译过程中生成模块文件,然后由其他.cpp文件使用.
这看起来非常棒.
但我的问题是:为什么他们从C++ 0x删除它?是因为太多的技术难题?时间不够?你是否认为他们会考虑使用它来获得一个不可思议的C++版本?
我正试图XRankNTypes
在GHCi中启用.我该怎么做呢?
我遇到了这个奇怪的C++程序.
#include <iostream>
using namespace std;
int main()
{
int a = ({int x; cin >> x; x;});
cout << a;
}
Run Code Online (Sandbox Code Playgroud)
谁能解释一下发生了什么?这个结构叫做什么?
我只是做了一些Haskell开发,并在新版本的GHC上重新编译了一些旧代码:
The Glorious Glasgow Haskell Compilation System, version 7.2.1
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
警告:不推荐使用-XDatatypeContexts:它被广泛认为是错误的,并且已从Haskell语言中删除.
当您拥有以下格式的代码时,会出现这种情况:
data Ord a => MyType a
= ConstructorOne a
= ConstructorTwo a a
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么这个功能首先被弃用,而我应该做些什么而不是实现相同或类似的功能呢?
我已经有过几次GHC告诉我使用扩展的经验,但却发现当使用该扩展时,我使代码变得更加复杂,当一个简单的重构允许我坚持使用Haskell 98(现在2010)并有一个更直接的解决方案.
另一方面,有时候GADT或Rank2Types(很少是RankNTypes)的工作量少得多,代码也更清晰.
哪些扩展通常会掩盖更好设计的可能性,并且通常会改善它?如果有一些同时执行这两项工作,那么在决定使用该扩展之前,用户应该寻找什么(确定它们是否符合他们想要的解决方案)?
(另请参阅我是否应该使用GHC Haskell扩展?)
我在C中看到一个程序,其代码如下:
static void *arr[1] = {&& varOne,&& varTwo,&& varThree};
varOne: printf("One") ;
varTwo: printf("Two") ;
varThree: printf("Three") ;
Run Code Online (Sandbox Code Playgroud)
我&&
对它的作用感到困惑,因为它左边没有任何东西.它默认评估为null吗?或者这是一个特例吗?
编辑:添加了一些更多信息,以使问题/代码更清楚我的问题.谢谢大家的帮助.这是gcc特定扩展的一个例子.
由于这些灵活的上下文和实例在Haskell标准中不可用,我认为在使用它们时存在潜在的问题.这些是什么?它们会导致一些含糊不清,不可判断,重叠的实例等吗?
有一个类似的问题只是问FlexibleInstances
,不是FlexibleContexts
,但答案只说"使用它们是安全的".
假设Haskell库设计者UndecidableInstances
出于某种原因决定使用它.图书馆编译得很好.现在假设某些程序使用该库(比如定义其类型类的某些实例),但不使用该扩展.是否会发生编译失败(不终止)?
如果出现这种情况,我会很高兴看到一个例子.例如,由于mtl使用UndecidableInstances
了很多,是否可以编写依赖于mtl(或使用该扩展的任何其他标准库)的程序,不使用UndecidableInstances
自身,但由于不可判断而无法编译?
问题的答案是否可以在JavaScript中创建自定义运算符?还没有,但@Benjamin建议可以使用第三方工具添加新的运算符:
虽然需要额外的编译步骤,但可以使用像sweet.js这样的第三方工具来添加自定义运算符.
我会采用相同的例子,就像上一个问题一样:
对于任何两个实数x和y:x∘y是x + 2y,也是实数.如何在我的扩展JavaScript语言中添加此运算符?
运行以下代码后:
var x = 2
, y = 3
, z = x ? y;
console.log(z);
Run Code Online (Sandbox Code Playgroud)
输出将包含
8
Run Code Online (Sandbox Code Playgroud)
(因为8
是2 + 2 * 3
)
我如何扩展JavaScript语言以支持新的运算符?
从GHC的手册,安全语言部分:
模块边界控制 - 使用安全语言编译的Haskell代码保证只能访问通过其他模块导出列表公开可用的符号.其中一个重要的部分是安全编译的代码无法使用无法导入的数据构造函数来检查或创建数据值.如果模块M通过仔细使用其导出列表建立了一些不变量,则使用导入M的安全语言编译的代码保证遵守这些不变量.因此,模板Haskell
GeneralizedNewtypeDeriving
以安全语言禁用,因为它们可用于违反此属性.
如何使用GeneralizedNewtypeDeriving
?打破模块的不变量?