我已经阅读了很多有关类型,高级类型等等的有趣内容.默认情况下,Haskell支持两种类型:
** ? *最新的GHC语言扩展ConstraintKinds增加了一种新的:
Constraint在阅读这个邮件列表后,很明显可能存在另一种类型,但GHC不支持它(但这种支持是在.NET中实现的):
#我已经了解了多态种类,我想我理解这个想法.Haskell也支持明确的kinded量化.
所以我的问题是:
subkinding意思?它在哪里实施/有用?kinds,就像kinds一个类型系统在上面types?(只是感兴趣)我有一个大的集合(〜数千)整数序列.每个序列都具有以下属性:
请注意,属性2.和3.意味着序列实际上是集合,但它们存储为C阵列以最大化访问速度.
我正在寻找一个好的C++算法来检查集合中是否已经存在新序列.如果不是,则将新序列添加到集合中.我考虑过使用哈希表(但请注意,我不能使用任何C++ 11构造或外部库,例如Boost).散列序列并将值存储在a std::set中也是一种选择,因为如果碰撞很少见,就可以忽略它们.任何其他建议也欢迎.
我需要一个可交换的哈希函数,即一个不依赖于序列中元素顺序的函数.我想首先将序列缩减为某些规范形式(例如排序),然后使用标准散列函数(参见下面的参考文献),但我宁愿避免与复制相关的开销(我无法修改原始序列)和排序.据我所知,下面引用的函数都不是可交换的.理想情况下,散列函数还应该利用元素永不重复的事实.速度至关重要.
有什么建议?
假设我有一堆有关类实例的有效指针A.我能安全且可移植地假设指针在整个对象生命周期内保持不变吗?换句话说,我可以使用指向对象的指针作为唯一对象ID吗?
请考虑以下代码段:
#include <map>
class A {
static std::map<int,int> theMap;
#pragma omp threadprivate(theMap)
};
std::map<int,int> A::theMap;
Run Code Online (Sandbox Code Playgroud)
使用OpenMP进行编译失败,并显示以下错误消息:
$ g++ -fopenmp -c main.cpp
main.cpp:5:34: error: ‘threadprivate’ ‘A::theMap’ has incomplete type
Run Code Online (Sandbox Code Playgroud)
我不明白这一点.我可以编译没有#pragma指令,它应该意味着std::map是不完整的.如果Map是基本类型(double,int ...),我也可以编译.
如何制作全局静态std::map threadprivate?
我有许多单元测试利用了@composite我编写的策略。该策略非常慢(它生成复杂的对象),并且有时其中一个测试无法通过too_slow运行状况检查。当这种情况发生时,我深深地叹了一口气,然后补充道
@settings(suppress_health_check=(HealthCheck.too_slow,))
Run Code Online (Sandbox Code Playgroud)
进行测试。
有没有办法HealthCheck.too_slow一劳永逸地抑制所有使用慢速策略的测试?
我有几个项目由几个库组成,每个库都位于自己的子目录中,由最顶层的CMakeLists.txt文件编织在一起。我习惯于project(<DIRNAME>)在每个CMakeLists.txt文件的顶部使用,并且我尝试以这样的方式构建子项目,以便它们可以与顶部项目分开编译。然而,虽然这对于独立的核心库可能有意义,但它不能用于依赖它们的库,因为我需要做类似的事情
target_link_libraries(gui core)
Run Code Online (Sandbox Code Playgroud)
而且core会也不如果我想要编译被定义gui为一个独立的项目。
project()在这种情况下使用是错误的,还是我遗漏了什么?
假设我有一个名为 的 Haskell 模块Foo,在src/Foo.hs. 还假设Foo导出一个类型Bar。
现在我想为Bar(Foo实际上是整个模块)编写单元测试,所以我将几个 QuickCheck 属性放入test/FooTest.hs; 但是,嘿,现在我需要Arbitrary为Bar.
还有一个问题:在-Wall -Werror模式中,ghc需要实例声明出现在两个地方之一:在定义类型的同一个文件中,或者在定义类的地方。但我不想让我的Foo模块与 QuickCheck 的构建依赖关系混乱,而且我显然无法Bar向 QuickCheck添加实例。
那么如何使我的数据类型成为 的实例Arbitrary,仅用于单元测试,而不为我的模块的用户引入对 QuickCheck 的依赖,并且不会抛出-Wall -Werror窗口?
我围绕使用RWS(Reader+ Writer+ State)monad 构建计算:
newtype Problem a = Problem { unProblem :: RWS MyEnv MyLog MyState a }
deriving ({- lots of typeclasses -})
Run Code Online (Sandbox Code Playgroud)
通过组装表单的基本计算逐步构建计算
foo :: a -> Problem b
Run Code Online (Sandbox Code Playgroud)
然而,有时候,子计算不需要RWSmonad 的全部功能.例如,考虑一下
bar :: c -> State MyState d
Run Code Online (Sandbox Code Playgroud)
我想bar在Problemmonad 的上下文中使用作为更大计算的一部分.我可以看到三种方式,这对我来说似乎都不是很优雅.
手动解包State计算并将其重新包装在RWS monad中:
baz :: a -> RWS MyEnv MyLog MyState c
baz x = do temp <- foo x
initialState <- get
let (finalResult, …Run Code Online (Sandbox Code Playgroud)我想使用QuickCheck来测试一个函数,以确保它终止(没有无限递归,没有抛出异常等).这就是我现在所做的:
f :: Int -> Int -> Int
prop_fTerminates :: Int -> Int -> Bool -- say
prop_fTerminates x y = f x y `seq` True
Run Code Online (Sandbox Code Playgroud)
是否有更好的(更具表现力和惯用语)的方式?
我所知道的大多数Haskell教程(例如LYAH)都引入了newtypes作为一种免费的成语,可以实现更多类型的安全性.例如,此代码将进行类型检查:
type Speed = Double
type Length = Double
computeTime :: Speed -> Length -> Double
computeTime v l = l / v
Run Code Online (Sandbox Code Playgroud)
但这不会:
newtype Speed = Speed { getSpeed :: Double }
newtype Length = Length { getLength :: Double }
-- wrong!
computeTime :: Speed -> Length -> Double
computeTime v l = l / v
Run Code Online (Sandbox Code Playgroud)
这将:
-- right
computeTime :: Speed -> Length -> Double
computeTime (Speed v) (Length l) = l / v …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,将指向标准布局类型的指针reinterpret_cast指向指向 的任何成员的指针是合法的,可能使用宏。如果只有一名成员,则没有必要,这是合法的: SSoffsetofSoffsetof
struct S {
int x;
};
static_assert(std::is_standard_layout_v<S>);
void f(S s) {
// this is legal for standard-layout classes, offsetof the first member is zero
S *s0 = &s;
int *x0 = reinterpret_cast<int *>(s0);
}
Run Code Online (Sandbox Code Playgroud)
但现在假设我有一个数组S:
struct S {
int x;
};
static_assert(std::is_standard_layout_v<S>);
void f(S s) {
// this is legal for standard-layout classes, offsetof the first member is zero
S *s0 = &s;
int …Run Code Online (Sandbox Code Playgroud)