我想建立一个包含一个共同属性的不同东西的列表,即它们可以变成字符串.面向对象的方法很简单:定义接口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) 我有简单的类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())线的目的是什么?
我需要以编程方式计算给定jar文件中编译的类,接口和枚举的数量(所以我需要三个单独的数字).哪种API对我有帮助?(我不能使用第三方库.)
我已经尝试了相当棘手的方案,似乎并不总是正确的.也就是说,我将每个ZipEntry读入一个byte [],然后将结果提供给我的自定义类加载器,它扩展了标准的CalssLoader,并将此byte []发送到ClassLoader.defineClass(这是保护,无法直接从应用程序代码调用).完整代码在Pastebin上.
我想使用嵌套的嵌套列表2来表示矩阵(例如[[1,2,3],[4,5,6]]).我如何定义处理小子矩阵(比如2*2)的函数?我期待这样的事情:
f (a1:a2:a) : (b1:b2:b) : x = ...
其中a1,a2是第一行的两个连续元素,b1,b2 - 第二行.a,b是相应的第一和第二行的休止符.x是矩阵行的其余部分.
但这显然不起作用.
提前致谢!
我正在尝试从标准分发中构建一个示例,即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).
我扫描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?
我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?
正如Andrew Sutton在一些会谈和论文中指出的那样,Concepts Lite提案确实具有基于概念的重载功能,同时没有概念图的概念,即模板参数完全由概念检查.编译器.鉴于此,目前尚不清楚他们如何解决Siek和Gregor在2005年论文中描述的问题," 明确的模型定义是必要的 ".简而言之,问题可以通过以下文章引用来说明.
因此,某些输入迭代器类型(例如istream_iterator)会被错误分类为前向迭代器.这有什么危险?一些算法基于Input_iterator与Forward_iterator进行调度.
(除了迭代器之外还有更多的例子.)
是的,我知道上面提到的论文考虑了C++ 0x概念,但问题似乎是概念提议的"通用".
迭代槽键集的传统任务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::bind为boost::bind可解决问题。但是我的项目中有一个std::bind仅使用的代码约定。
有什么建议怎么办?(我应该向Boost团队写错误报告吗?)
我曾经在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中最清晰的模拟是什么?
我在这里搜索并发现一些讨论集中在从函数返回函数(以及在尝试调用这样的"返回"函数时可能出现的问题),这是不完全相同的情况,据我所知.