小编Art*_*syn的帖子

showables列表:OOP击败Haskell?

我想建立一个包含一个共同属性的不同东西的列表,即它们可以变成字符串.面向对象的方法很简单:定义接口Showable并使感兴趣的类实现它.当你不能改变类时,第二点原则上可能是一个问题,但让我们假装情况并非如此.然后你创建一个Showables 列表并用这些类的对象填充它而不会产生任何额外的噪音(例如,通常隐式地进行向上转换).这里给出了Java中的概念证明.

我的问题是我在Haskell中有什么选择?下面我讨论一些我尝试过但并不能让我满意的方法.

方法1:existensials.工作但丑陋.

{-# LANGUAGE ExistentialQuantification #-}
data Showable = forall a. Show a => Sh a

aList :: [Showable]
aList = [Sh (1 :: Int), Sh "abc"]
Run Code Online (Sandbox Code Playgroud)

我这里的主要缺点是Sh填写清单时的必要性.这非常类似于在OO语言中隐式完成的向上操作.

更一般地说,Showable已经在语言Show类型类中的虚拟包装器在我的代码中增加了额外的噪声.不好.

方法2:impredicatives.期望但不起作用.

对我来说这个列表最直接的类型和我真正想要的是:

{-# LANGUAGE ImpredicativeTypes #-}
aList :: [forall a. Show a => a]
aList = [(1 :: Int), "abc"]
Run Code Online (Sandbox Code Playgroud)

除此之外(正如我所听到的)ImpredicativeTypes"最好是脆弱而最糟糕的是"它不会编译:

Couldn't match expected type ‘a’ with actual type ‘Int’
  ‘a’ …
Run Code Online (Sandbox Code Playgroud)

haskell

40
推荐指数
6
解决办法
3140
查看次数

Eclipse生成的equals():getOuterType()?

我有简单的类Point有两个类型的字段double.我让Eclipse 3.6生成equals()hashCode()为它生成.该equals()方法如下所示:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    if (!getOuterType().equals(other.getOuterType()))
        return false;
    if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
        return false;
    if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
        return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

getOuterType看起来像这样:

private Point getOuterType() {
    return Point.this;
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:getOuterType().equals(other.getOuterType())线的目的是什么?

java eclipse

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

以编程方式分析jar文件

我需要以编程方式计算给定jar文件中编译的类,接口和枚举的数量(所以我需要三个单独的数字).哪种API对我有帮助?(我不能使用第三方库.)

我已经尝试了相当棘手的方案,似乎并不总是正确的.也就是说,我将每个ZipEntry读入一个byte [],然后将结果提供给我的自定义类加载器,它扩展了标准的CalssLoader,并将此byte []发送到ClassLoader.defineClass(这是保护,无法直接从应用程序代码调用).完整代码在Pastebin上.

java jar classloader

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

Haskell中嵌套列表的模式匹配

我想使用嵌套的嵌套列表2来表示矩阵(例如[[1,2,3],[4,5,6]]).我如何定义处理小子矩阵(比如2*2)的函数?我期待这样的事情: f (a1:a2:a) : (b1:b2:b) : x = ... 其中a1,a2是第一行的两个连续元素,b1,b2 - 第二行.a,b是相应的第一和第二行的休止符.x是矩阵行的其余部分.

但这显然不起作用.

提前致谢!

haskell

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

构建LLVM示例

我正在尝试从标准分发中构建一个示例,即BrainF并没有成功.

我制作了我的示例/ BrainF的副本,并试图从这个目录运行cmake.最初CMakeLists.txt看起来像这样:

set(LLVM_LINK_COMPONENTS jit bitwriter nativecodegen interpreter)

add_llvm_example(BrainF
  BrainF.cpp
  BrainFDriver.cpp
  )
Run Code Online (Sandbox Code Playgroud)

cmake抱怨add_*.我通过http://llvm.org/docs/CMake.html#embedding阅读并决定在CMakeLists.txt中添加一些前奏:

find_package(LLVM)

# Define add_llvm_* macro's.
include(AddLLVM)

add_definitions(${LLVM_DEFINITIONS})
include_directories(${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})
Run Code Online (Sandbox Code Playgroud)

然后cmake抱怨它无法执行find_package(LLVM)并建议寻找LLVMConfig.cmake或llvm-config.cmake.我在/usr/src/llvm/cmake/modules/LLVM-Config.cmake下找到的最接近的东西,所以我设置CMAKE_PREFIX_PATH=/usr/src/llvm/cmake/modules/并将LLVMConfig.cmake软链接到LLVM-Config.cmake.

然后cmake以这种方式抱怨:"包括找不到加载文件:AddLLVM".如果我将整个路径硬编码为包含AddLLVM.cmake,则问题包括AddLLVM.cmake中包含哪些内容,因此它似乎不是完成任务的正确方法.

我的环境是Xubuntu 12.04和llvm + clang 3.1(来自某些ppa的deb包,来自Debian的backport).

cmake llvm

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

变量的字节表示中出现意外结果

我扫描int变量的字节表示并得到一些意想不到的结果.

如果我做

int a = 127;
cout << (unsigned int) *((char *)&a);
Run Code Online (Sandbox Code Playgroud)

我按预期得到了127.如果我做

int a = 256;
cout << (unsigned int) *((char *)&a + 1);
Run Code Online (Sandbox Code Playgroud)

我按预期得到1.但如果我这样做

int a = 128;
cout << (unsigned int) *((char *)&a);
Run Code Online (Sandbox Code Playgroud)

我有4294967168,很......非常喜欢.

问题是:在查看int变量的第一个字节时,有没有办法获得128,其值为128?

c c++ casting

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

Pandoc增加了额外的段落

pandoc用来将Markdown转换为Latex.我的问题是pandoc在开始/结束环境中添加额外的段落中断.

资源:

**First** phrase in a paragraph.
\begin{multline*}
some long formulae
\end{multline*}
Second phrase in a paragraph.
Run Code Online (Sandbox Code Playgroud)

这样pandoc my.md -o my.tex得到:

\textbf{First} phrase in a paragraph.

\begin{multline*}
some long formulae
\end{multline*}

Second phrase in a paragraph.
Run Code Online (Sandbox Code Playgroud)

很明显,这是不恰当的行为,因为当它看到额外的空行时,乳胶在生成的PDF中放置了额外的垂直空间multline.

有没有办法在.tex输出中抑制额外的空行pandoc

markdown latex pandoc

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

如何在没有显式模型的情况下避免基于概念的重载问题(也就是概念图)

正如Andrew Sutton在一些会谈和论文中指出的那样,Concepts Lite提案确实具有基于概念的重载功能,同时没有概念图的概念,即模板参数完全由概念检查.编译器.鉴于此,目前尚不清楚他们如何解决Siek和Gregor在2005年论文中描述的问题," 明确的模型定义是必要的 ".简而言之,问题可以通过以下文章引用来说明.

因此,某些输入迭代器类型(例如istream_iterator)会被错误分类为前向迭代器.这有什么危险?一些算法基于Input_iterator与Forward_iterator进行调度.

(除了迭代器之外还有更多的例子.)

是的,我知道上面提到的论文考虑了C++ 0x概念,但问题似乎是概念提议的"通用".

c++ c++-concepts

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

boost :: transform_iterator不适用于std :: bind(&Pair :: first,_1)吗?

迭代槽键集的传统任务std::map使我陷入另一场混乱,这里似乎还没有讨论过。

简而言之,此代码无法编译(大量使用C ++ 11):

typedef std::pair<int, int> Pair;
vector<Pair> v {Pair(1,2), Pair(2,3)};
using namespace std::placeholders;
auto choose_first = std::bind(&Pair::first, _1);
boost::make_transform_iterator(v.begin(), choose_first);
Run Code Online (Sandbox Code Playgroud)

错误信息如下。

no type named 'result_type' in 'struct std::_Bind<std::_Mem_fn<int std::pair<int, int>::*>(std::_Placeholder<1>)>' 
Run Code Online (Sandbox Code Playgroud)

同时,更改std::bindboost::bind可解决问题。但是我的项目中有一个std::bind仅使用的代码约定。

有什么建议怎么办?(我应该向Boost团队写错误报告吗?)

c++ boost c++11

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

CL中的辅助嵌套函数

我曾经在Haskell中编写嵌套的辅助函数(其中,顺便说一下,使用外部函数的参数并且是递归的),就像这样(loop):

sum a b = let
  loop s i = if i > b then s else loop (s + i) (i + 1)
  in loop 0 a
Run Code Online (Sandbox Code Playgroud)

Common Lisp中最清晰的模拟是什么?

我在这里搜索并发现一些讨论集中在从函数返回函数(以及在尝试调用这样的"返回"函数时可能出现的问题),这是不完全相同的情况,据我所知.

common-lisp nested-function

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