我正在学习编程语言的课程,"什么时候是一个函数是另一个函数的子类型"的答案对我来说非常反直觉.
澄清一下:假设我们有以下类型关系:
bool<int<real
Run Code Online (Sandbox Code Playgroud)
为什么函数(real->bool)是子类型(int->bool?不应该是相反的方式吗?
我希望子类型函数的标准是:如果f2可以采用f1可以采用的任何参数,则f1是f2的子类型,并且f1仅返回f2返回的值.显然有f1可以采用的值,但f2不能.
有没有办法模拟:yourprogram < inputFile.txt在Visual Studio 2008中?
我正在尝试在Prolog中实现一个findall谓词(是的,我知道它是内置的,这是一个赋值).
它写成如下:
my_findall(N,P,Pred,L) :- Pred, not(new(N,P)), !, assert(new(N,P)), my_findall(N1,P1,Pred,L1), L=[N,P,L1], retract(new(N,P)).
my_findall(_,_,_, []).
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它只给我第一个解决方案并停在那里,好像第二次调用my_findall失败了.根据我的理解,回溯机制应该覆盖所有可能的选项,其中应包括调用Pred(N,P)的所有选项,因此即使第二次调用在第一次尝试时失败(为Pred尝试的第一个选项已经已断言),它应该在放弃并转到my_findall((,),_,[])之前先尝试所有其他选项.
如果这不是它的工作方式,有没有办法强制这种行为而不完全重写解决方案?
我在Visual Studio 2008中收到以下错误:错误C2248:'Town :: Town':无法访问在类'Town'中声明的私有成员.看起来构造函数无法访问其自己的类的成员.知道发生了什么事吗?这是代码:
我有这个:
template<class T> class Tree{...}
Run Code Online (Sandbox Code Playgroud)
而这堂课:
class Town{
Town(int number):number(number){};
...
private:
int number;
};
Run Code Online (Sandbox Code Playgroud)
本课程使用的是:
class Country{
public:
StatusType AddTown(Shore side, int location, int maxNeighborhoods);
private:
Tree<Town> towns[2];
...
}
Run Code Online (Sandbox Code Playgroud)
这是AddTown函数:
StatusType Country::AddTown(Shore side, int location, int maxNeighborhoods){
if (maxNeighborhoods<0 || location<0){
return INVALID_INPUT;
}
Town* dummy= new Town(location);//Here be error C2248
if (towns[side].find(*dummy)!=NULL){
delete dummy;
return FAILURE;
}
SouthBorder* dummyBorder;
(side==NORTH)?dummyBorder=new SouthBorder(location,0):dummyBorder=new SouthBorder(0,location);
if (southBorders.find(*dummyBorder)!=NULL){
delete dummyBorder;
return FAILURE;
}
towns[side].add(*dummy);
delete dummyBorder; …Run Code Online (Sandbox Code Playgroud) 假设我们有一个A类,B和C继承它.然后我们创建一个对A的引用数组,并用B和C填充它.现在我们决定要消除所有的C.有没有办法检查数组的每个字段实际上保持什么类型而不执行像returnType()函数那样多余的事情?
编辑:修复"A的数组"到"A的引用数组".
我正在尝试在Red Hat 8.0中添加一个新的系统调用,我对该机制的某些方面感到困惑.:我一直遵循本指南http://www.linuxjournal.com/article/3326其中详细介绍了更新系统调用表的步骤entry.S和unistd.h.
但是,我似乎无法弄清楚编译器如何从这些信息中实际找到实现系统调用的位置.显然有一些涉及#includes 的东西,但我找不到包含的任何迹象,也没有找到代码中的许多系统调用.我需要做什么才能找到我的系统调用?
有一个很好的Linux数据库,我可以搜索一个函数名称,它告诉我它定义了哪个头?谷歌搜索并不总是适用于我,并不总是手册页.
我刚刚开始使用Prolog,我无法弄清楚为什么以下内容无法正常工作.我正在尝试创建一个谓词,如果列表L2包含在L1中,则该谓词返回true.这就是我写的:
assert(contains (L1, L1)).
assert(contains(L1, [X|L2]):-member(X, L1), contains(L1, L2)).
assert(contains(L1, [])).
Run Code Online (Sandbox Code Playgroud)
我认为这将相当于"如果'L3 = X | L2'的X在L1中,并且L2在L1中则为真",包含(L1,L2)递归翻译,直到所有成员都被遍历为止我们留下最后一个选项,或者我们找到一个不在L1中的成员,它将使谓词失败.
不幸的是,它似乎没有这样的方式.它似乎只返回成员(X,L1)的值,因此包含([1,2,3],[1,4,5])通过,但包含([1,2,3],[4, 1,5])没有.
我究竟做错了什么?
c++ ×2
linux ×2
prolog ×2
file-io ×1
polymorphism ×1
system-calls ×1
templates ×1
type-theory ×1
typechecking ×1
types ×1
vim ×1
word-wrap ×1