小编Are*_* Fu的帖子

类型理论:类型种类

我已经阅读了很多有关类型,高级类型等等的有趣内容.默认情况下,Haskell支持两种类型:

  • 简单类型: *
  • 类型构造函数: * ? *

最新的GHC语言扩展ConstraintKinds增加了一种新的:

  • 类型参数约束: Constraint

在阅读这个邮件列表后,很明显可能存在另一种类型,但GHC不支持它(但这种支持是在.NET中实现的):

  • 未装箱类型: #

我已经了解了多态种类,我想我理解这个想法.Haskell也支持明确的kinded量化.

所以我的问题是:

  • 是否存在其他类型的种类?
  • 还有其他类似的语言功能吗?
  • 什么subkinding意思?它在哪里实施/有用?
  • 是否有一个类型系统kinds,就像kinds一个类型系统在上面types?(只是感兴趣)

haskell types type-theory programming-languages scala

26
推荐指数
3
解决办法
1397
查看次数

散乱无序的小整数序列

背景

我有一个大的集合(〜数千)整数序列.每个序列都具有以下属性:

  1. 它的长度为12;
  2. 序列元素的顺序无关紧要;
  3. 没有元素在同一序列中出现两次;
  4. 所有元素都小于约300.

请注意,属性2.和3.意味着序列实际上是集合,但它们存储为C阵列以最大化访问速度.

我正在寻找一个好的C++算法来检查集合中是否已经存在新序列.如果不是,则将新序列添加到集合中.我考虑过使用哈希表(但请注意,我不能使用任何C++ 11构造或外部库,例如Boost).散列序列并将值存储在a std::set中也是一种选择,因为如果碰撞很少见,就可以忽略它们.任何其他建议也欢迎.

我需要一个可交换的哈希函数,即一个不依赖于序列中元素顺序的函数.我想首先将序列缩减为某些规范形式(例如排序),然后使用标准散列函数(参见下面的参考文献),但我宁愿避免与复制相关的开销(我无法修改原始序列)和排序.据我所知,下面引用的函数都不是可交换的.理想情况下,散列函数还应该利用元素永不重复的事实.速度至关重要.

有什么建议?

c++ algorithm hash set sequence

12
推荐指数
2
解决办法
3123
查看次数

指针可以安全地和可移植地用作对象ID吗?

假设我有一堆有关类实例的有效指针A.我能安全且可移植地假设指针在整个对象生命周期内保持不变吗?换句话说,我可以使用指向对象的指针作为唯一对象ID吗?

c++ pointers

8
推荐指数
4
解决办法
2283
查看次数

在C++ STL类型的静态实例上使用OpenMP threadprivate指令

请考虑以下代码段:

#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

c++ stl openmp

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

抑制复合假设策略的 HealthCheck.too_slow

我有许多单元测试利用了@composite我编写的策略。该策略非常慢(它生成复杂的对象),并且有时其中一个测试无法通过too_slow运行状况检查。当这种情况发生时,我深深地叹了一口气,然后补充道

@settings(suppress_health_check=(HealthCheck.too_slow,))
Run Code Online (Sandbox Code Playgroud)

进行测试。

有没有办法HealthCheck.too_slow一劳永逸地抑制所有使用慢速策略的测试?

python python-hypothesis

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

对依赖的 CMake 子目录使用 project()

我有几个项目由几个库组成,每个库都位于自己的子目录中,由最顶层的CMakeLists.txt文件编织在一起。我习惯于project(<DIRNAME>)在每个CMakeLists.txt文件的顶部使用,并且我尝试以这样的方式构建子项目,以便它们可以与顶部项目分开编译。然而,虽然这对于独立的核心库可能有意义,但它不能用于依赖它们的库,因为我需要做类似的事情

target_link_libraries(gui core)
Run Code Online (Sandbox Code Playgroud)

而且core会也不如果我想要编译被定义gui为一个独立的项目。

project()在这种情况下使用是错误的,还是我遗漏了什么?

project cmake subdirectory

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

声明任意实例时避免构建对 QuickCheck 的依赖

假设我有一个名为 的 Haskell 模块Foo,在src/Foo.hs. 还假设Foo导出一个类型Bar

现在我想为BarFoo实际上是整个模块)编写单元测试,所以我将几个 QuickCheck 属性放入test/FooTest.hs; 但是,嘿,现在我需要ArbitraryBar.

还有一个问题:在-Wall -Werror模式中,ghc需要实例声明出现在两个地方之一:在定义类型的同一个文件中,或者在定义类的地方。但我不想让我的Foo模块与 QuickCheck 的构建依赖关系混乱,而且我显然无法Bar向 QuickCheck添加实例。

那么如何使我的数据类型成为 的实例Arbitrary,仅用于单元测试,而不为我的模块的用户引入对 QuickCheck 的依赖,并且不会抛出-Wall -Werror窗口?

testing haskell unit-testing quickcheck build-dependencies

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

将计算从State monad提升到RWS monad

我围绕使用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)

我想barProblemmonad 的上下文中使用作为更大计算的一部分.我可以看到三种方式,这对我来说似乎都不是很优雅.

  1. 手动解包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)

monads state haskell writer reader

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

如何使用QuickCheck测试函数是否终止?

我想使用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 quickcheck

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

即使你不能对它们进行模式匹配,新类型也不会产生费用吗?

上下文

我所知道的大多数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)

haskell newtype

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

将标准布局对象数组转换为元素数组

在 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)

c++ arrays casting standard-layout

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