小编cib*_*en1的帖子

为什么我们需要monad?

我谦虚地看到着名问题"什么是单子?"的答案.,特别是投票最多的人,试着解释什么是monad而没有明确解释为什么monad真的是必要的.他们可以解释为问题的解决方案吗?

monads haskell

358
推荐指数
7
解决办法
5万
查看次数

155
推荐指数
2
解决办法
14万
查看次数

如何区分具有相同参数的两个构造函数?

假设我们想要一个表示复数的类的两个构造函数:

Complex (double re, double img)  // construct from cartesian coordinates
Complex (double A, double w) // construct from polar coordinates
Run Code Online (Sandbox Code Playgroud)

但参数(数量和类型)是相同的:确定目标是什么的更优雅的方法是什么?将第三个参数添加到其中一个构造函数中?

c++ parameters constructor

33
推荐指数
4
解决办法
1万
查看次数

const向量意味着const元素?

是否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)

c++ const

32
推荐指数
4
解决办法
3万
查看次数

"链接操作"是Monad课程解决的"唯一"问题吗?

澄清问题:它是关于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专家提出两个问题:

  1. 一个具体的问题:monad类是否有任何其他问题解决(离开monadic类)?那么,它与链接操作问题的相关性如何?
  2. 一个可选的一般问题:我的结论是对的,我是否误解了什么?

参考

教程

StackOverflow问题与解答

monads haskell functional-programming

27
推荐指数
2
解决办法
1247
查看次数

如何指出容器模板参数的类型?

假设我们有这个 template

template<typename Container, typename T> 
bool    contains (const Container & theContainer, const T & theReference) {
     ...
}
Run Code Online (Sandbox Code Playgroud)

如何说明,容器中的元素显然应该是类型T

这一切都可以缩写(也许在C++ 11中)?

c++ templates c++11

22
推荐指数
5
解决办法
2673
查看次数

20
推荐指数
1
解决办法
7987
查看次数

Java线程和垃圾收集器

可能重复:是否
收集了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)

(请注意,我们没有指向它们的指针).

  1. 在线程结束之前,垃圾收集器是否可以删除这些实例run()?(换句话说:是否有Foo对象的引用?)

  2. 而且,另一方面,在`run()'中的线程结束后,或者我们是否在浪费内存("内存泄漏")后,GC会删除这些实例吗?

  3. 如果1.或2.是问题,那么正确的方法是什么?

谢谢

java multithreading garbage-collection

20
推荐指数
3
解决办法
7716
查看次数

括号()使用的是什么意思?

我读到了,你知道你已经知道了

枚举成员是按顺序排序的类型... 此类中的类型:(),Bool,Char ...

它也出现在一些签名中:

putChar  ::    Char -> IO ()
Run Code Online (Sandbox Code Playgroud)

在Google中很难找到有关它的信息,因为答案是指"常见括号"的问题(用于函数调用,优先级问题等).

因此,表达()意味着什么?这是一种类型吗?什么是类型的变量()?什么用于何时需要?

haskell parentheses

19
推荐指数
3
解决办法
3182
查看次数

如何在C++中展开一个短循环

我想知道如何得到这样的东西:

  1. copy(a, b, 2, 3)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后得到

    a[2] = b[2];
    a[3] = b[3];
    a[4] = b[4];
    
    Run Code Online (Sandbox Code Playgroud)

我知道C#defines不能递归使用以获得该效果.但我正在使用C++,所以我认为模板元编程可能是合适的.

我知道有一个Boost库,但我只想要那个"简单"的技巧,而Boost太"混乱"了.

c++ metaprogramming

15
推荐指数
2
解决办法
1万
查看次数