小编Evg*_*lai的帖子

关于Haskell中的控制流结构(多个if-then-else)

我想将以下程序程序转换为Haskell [以伪代码编写]:

f(x) {
  if(c1(x)) {
     if(c2(x)) {
        return a(x);
     }
     else if (c3(x)) {
      if(c4(x)) {
         return b(x);
     }
  }
  return d(x);
}
Run Code Online (Sandbox Code Playgroud)

我写了以下实现:

f x = 
  if (c1 x) then
     if(c2 x) then 
            a x
     else if (c3 x) then
              if (c4 x) then
                  b x
              else d x
     else d x
  else d x 
Run Code Online (Sandbox Code Playgroud)

不幸的是它包含(否则为dx)三次.

有没有更好的方法来实现该功能?(即,如果没有满足任何条件,则返回(dx)?)

我知道我们可以将条件c1和c2组合成(c1 x)&&(c2 x)以使if的数量更小,但我的条件c1,c2,c3,c4确实很长,如果我将它们组合起来,我会得到一个多于一行的条件.

haskell functional-programming if-statement

18
推荐指数
4
解决办法
1942
查看次数

numpy.getbuffer导致AttributeError:'module'对象没有属性'getbuffer'

我想从Python 3中的numpy数组中获取缓冲区.我找到了以下代码:

$ python3
Python 3.2.3 (default, Sep 25 2013, 18:25:56) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> a = numpy.arange(10)
>>> numpy.getbuffer(a)
Run Code Online (Sandbox Code Playgroud)

但是它会在最后一步产生错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getbuffer'
Run Code Online (Sandbox Code Playgroud)

我为什么做错了?该代码适用于Python 2.我使用的numpy版本是1.6.1.

python numpy python-3.x

9
推荐指数
2
解决办法
5296
查看次数

Java中的递归泛型定义和Stackoverflow

我正在为一些研究项目编写确定性有限自动机的实现,并且有一些弧导致相同的状态.我为State编写了这个类,但我想知道为什么代码会产生Stackoverflow:

 public class State extends HashMap<Character, HashSet<State>>
 {
    public static void main(String[]args)
    {
       State t=new State();
       t.addTransition('a',t);
       t.addTransition('b',t);
    }
    public void addTransition(Character symbol, State t )
    {
        if(!this.containsKey(symbol))
        {
            this.put(symbol, new HashSet<State>());
        }
        this.get(symbol).add(t);
    }
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,如果我删除其中一个"addTransition"调用,则没有错误.

我的Java版本是JDK 1.6.37,操作系统是Ubuntu Linux 12.04.

*UPD:*堆栈跟踪是:

Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap$KeyIterator.<init>(HashMap.java:843)
at java.util.HashMap$KeyIterator.<init>(HashMap.java:843)
at java.util.HashMap.newKeyIterator(HashMap.java:857)
at java.util.HashMap$KeySet.iterator(HashMap.java:891)
at java.util.HashSet.iterator(HashSet.java:170)
at java.util.AbstractSet.hashCode(AbstractSet.java:122)
at java.util.HashMap$Entry.hashCode(HashMap.java:737)
at java.util.AbstractMap.hashCode(AbstractMap.java:494)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
at java.util.HashMap$Entry.hashCode(HashMap.java:737)
at java.util.AbstractMap.hashCode(AbstractMap.java:494)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
at java.util.HashMap$Entry.hashCode(HashMap.java:737)
...
at java.util.AbstractMap.hashCode(AbstractMap.java:494)
at java.util.AbstractSet.hashCode(AbstractSet.java:126) …
Run Code Online (Sandbox Code Playgroud)

java stack-overflow generics dfa

7
推荐指数
1
解决办法
1171
查看次数

在amsthm包中的证明环境中"证明"后的换行符

我正在为LaTeX中的一个长定理写一个证明.证明的内容是一长串的项目.我的代码是:

    \begin{proof}
     \begin{itemize}
      \item asd
      \item asd
     \end{itemize}
    \end{proof}
Run Code Online (Sandbox Code Playgroud)

结果如下:

proof * asd
   * asd
Run Code Online (Sandbox Code Playgroud)

是否可以在"校对"字后插入换行符,以获得类似的内容:

proof 
   * asd
   * asd
Run Code Online (Sandbox Code Playgroud)

\newline,\\在证明环境中不起作用.也许有其他方法让它看起来更好?

我的乳胶分布是2011年的texlive

latex

6
推荐指数
1
解决办法
5232
查看次数

使用 Java 中的 ProcessBuilder 将进程的输出重定向到另一个进程的输入

我有 processBuilders 定义的两个进程:

ProcessBuilder pb1 = new ProcessBuilder (...)
ProcessBuilder pb2 = new ProcessBuilder (...)
Run Code Online (Sandbox Code Playgroud)

我希望 的输出pb1是 的输入pb2。我在文档中发现我可以pb2通过使用管道从另一个进程读取的输入:

pb2.redirectInput(Redirect.PIPE);
Run Code Online (Sandbox Code Playgroud)

但是,如何指定我希望此管道从 的输出中读取pb1

java pipe io-redirection processbuilder

5
推荐指数
1
解决办法
4801
查看次数

swi-prolog中的"NOT EXISTS"

我在prolog中遇到了一个简单的问题.我们来考虑一下该计划

worker(bill).
worker(smitt).
worker(fred).
worker(dany).
worker(john).
car(bmw).
car(mazda).
car(audi).
owner(fred,mazda).
owner(dany,bmw).
owner(john,audi).
Run Code Online (Sandbox Code Playgroud)

我需要再添加一个谓词no_car(X),如果worker X没有汽车,即如果我们输入查询,那将是真的吗?: - no_car(X).序言应该回答

X=smitt,
X=bill,
yes 
Run Code Online (Sandbox Code Playgroud)

我所做的是

   hascar(X):-owner(X,_).
   nocar(X):- worker(X),not hascar(X).
Run Code Online (Sandbox Code Playgroud)

但是这种方法不起作用,因为只有查询才能使用无限变量.所以,我真的坚持这个.我知道SQL中有"NOT EXISTS"字样允许在查询中表达这个逻辑,但在prolog中是否有类似的东西?

prolog

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

用于GUI元素的垃圾收集器

我在理解以下代码时遇到问题:

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

public class A
{
      public A(){
        JFrame myframe = new JFrame ("hz window");
        myframe.setLayout(new GridLayout ());
        myframe.setSize(new Dimension (500, 200));
        myframe.setVisible(true);
    }

    public static void main (String arg[]){
        new A();
        //  System.gc();                          //1
          //Runtime.getRuntime().gc();            //2
    }
}
Run Code Online (Sandbox Code Playgroud)

myframe对象的范围是A类的构造函数,对吧?

然后,为什么窗口没有消失(即,由第1行和第2行的垃圾收集器删除)

我们在java程序中创建的所有gui元素的范围是什么?

JVM在哪里保留应用程序的gui对象的所有链接?

我很抱歉新手问题.

java swing

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

C++模板扣除不起作用

对于以下代码:

#include<functional>
template<typename T>
void f(std::function<void(T)> g) {
}

template<typename T>
void g(T x) {
}

int main() {
   f(&g<int>);
}
Run Code Online (Sandbox Code Playgroud)

C++ 14编译器产生错误:

 no matching function for call to 'f(<unresolved overloaded function type>)'
     f(&g<int>);
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么模板参数推断在这里不起作用.看来,假设g的参数是int类型,我们可以推断出f的参数是类型的std::function<void(int)>,因此T = int在f中.为什么这不会发生?我对C++标准的相关部分感兴趣,这解释了这一点.T是否出现在非推断的上下文中?

以下类似的代码编译:

#include<vector>
template<typename T>
void f(std::vector<T> vec) { 
}


int main() {
    f(std::vector<int>{});
}
Run Code Online (Sandbox Code Playgroud)

所以它不是创建非推导上下文的尖括号.

c++ templates template-argument-deduction c++14

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