假设我们想要一个表示复数的类的两个构造函数:
Complex (double re, double img) // construct from cartesian coordinates
Complex (double A, double w) // construct from polar coordinates
Run Code Online (Sandbox Code Playgroud)
但参数(数量和类型)是相同的:确定目标是什么的更优雅的方法是什么?将第三个参数添加到其中一个构造函数中?
是否const vector<A>
意味着它的元素也是const
如此?
在下面的代码中,
v[0].set (1234);
in void g ( const vector<A> & v )
产生编译器错误
const.cpp:28:3:错误:成员函数'set'不可行:'this'参数的类型为'const value_type'(又名'const A'),但函数未标记为const
为什么?
但(*v[0]).set(1234);
在void h ( const vector<A *> & v )
是编译器确定.
版本之间有什么区别?
// ...........................................................
class A {
private:
int a;
public:
A (int a_) : a (a_) { }
int get () const { return a; }
void set (int a_) { a = a_; }
};
// ...........................................................
void g ( const vector<A> & …
Run Code Online (Sandbox Code Playgroud) 澄清问题:它是关于monad类型类的优点(而不是它没有统一类的实例).
在阅读了许多参考文献(见下文)之后,我得出的结论是,实际上,monad类只能解决一个问题,即大而重要的问题:关于具有上下文的类型的函数的"链接".因此,着名的句子"monad是可编程的分号".实际上,monad可以被视为具有辅助操作的函数数组.
我坚持monad 类之间的区别,被理解为其他类型的通用接口; 以及这些其他类型实例化类(因此,"monadic类型").
我理解monad类本身只解决了运算符的链接,因为主要是它只要求它的类型实例具有bind >>=
和return
,并且告诉我们它们必须如何表现.作为奖励,编译器非常有助于编码为monadic do
类型提供符号.
另一方面,实例化monad类的每个单独类型解决了每个具体问题,但不仅仅是作为Monad的实例.例如,Maybe
解决"函数如何返回值或错误",State
解决"如何使用全局状态的函数",IO
解决"如何与外部世界交互"等等.所有这些类都在上下文中封装了一个值.
但不久之后,我们需要对这些上下文类型进行连锁操作.也就是说,我们需要以特定的顺序组织对这些类型的函数的调用(对于这样一个问题的例子,请阅读你可能已经发明了monad的多值函数的例子).
如果每个类型都是monad类的实例,那么你就解决了链接的问题.为了使链接起作用,你需要>>=
具有它所具有的确切签名,而不是其他.(见这个问题).
因此,我猜你下次定义上下文数据类型T来解决问题时,如果你需要对函数的调用进行排序(在T的值上),可以考虑将T作为一个实例Monad
(如果你需要"选择链接",如果你可以从do
符号中受益).为了确保你做得对,检查T是否符合monad法则
然后,我向Haskell专家提出两个问题:
假设我们有这个 template
template<typename Container, typename T>
bool contains (const Container & theContainer, const T & theReference) {
...
}
Run Code Online (Sandbox Code Playgroud)
如何说明,容器中的元素显然应该是类型T
?
这一切都可以缩写(也许在C++ 11中)?
如何在ruby中模拟类似Java的注释?
(我们将得到答案,概括 http://bens.me.uk/2009/java-style-annotations-in-ruby)
可能重复:是否
收集了Java Thread Garbage
考虑以下课程:
class Foo implements Runnable {
public Foo () {
Thread th = new Thread (this);
th.start();
}
public run() {
... // long task
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们创建几个实例Foo
做
new Foo();
new Foo();
new Foo();
new Foo();
Run Code Online (Sandbox Code Playgroud)
(请注意,我们没有指向它们的指针).
在线程结束之前,垃圾收集器是否可以删除这些实例run()
?(换句话说:是否有Foo
对象的引用?)
而且,另一方面,在`run()'中的线程结束后,或者我们是否在浪费内存("内存泄漏")后,GC会删除这些实例吗?
如果1.或2.是问题,那么正确的方法是什么?
谢谢
我读到了,你知道你已经知道了
枚举成员是按顺序排序的类型... 此类中的类型:(),Bool,Char ...
它也出现在一些签名中:
putChar :: Char -> IO ()
Run Code Online (Sandbox Code Playgroud)
在Google中很难找到有关它的信息,因为答案是指"常见括号"的问题(用于函数调用,优先级问题等).
因此,表达()
意味着什么?这是一种类型吗?什么是类型的变量()
?什么用于何时需要?
我想知道如何得到这样的东西:
写
copy(a, b, 2, 3)
Run Code Online (Sandbox Code Playgroud)然后得到
a[2] = b[2];
a[3] = b[3];
a[4] = b[4];
Run Code Online (Sandbox Code Playgroud)我知道C#defines不能递归使用以获得该效果.但我正在使用C++,所以我认为模板元编程可能是合适的.
我知道有一个Boost库,但我只想要那个"简单"的技巧,而Boost太"混乱"了.
c++ ×4
haskell ×3
monads ×2
annotations ×1
c++11 ×1
const ×1
constructor ×1
cuda ×1
java ×1
nvidia ×1
parameters ×1
parentheses ×1
ruby ×1
templates ×1