小编Gre*_*ory的帖子

Cabal Multiple Executables

我在使用Yesod的网站上工作我正常运行,但我似乎无法可靠地填充我的数据库.我有第二个haskell程序填充数据库,我已经将它添加到我的cabal文件中,如下所示:

executable         program
  if flag(library-only)
    Buildable: False

  main-is:           ../main.hs
  hs-source-dirs:    dist
  build-depends:     base
                   , myproject
                   , yesod-default

executable         init
  if flag(library-only)
    Buildable: False

  main-is:           init.hs
  hs-source-dirs:    Init
  build-depends:     base
                   , directory
                   , persistent
                   , persistent-sqlite
                   , text
                   , myproject
                   , yesod-default
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行'cabal build'时,它不会在init.hs更改时重建init.我该怎么做才能实现这一目标?

这是一个示例终端会话(在编辑init.hs之后):

$ cabal build
Building myproject-0.0.0...
Preprocessing library myproject-0.0.0...
Registering myproject-0.0.0...
$ rm -rf dist/build/myproject/init
$ cabal build
Building myproject-0.0.0...
Preprocessing library myproject-0.0.0...
Registering myproject-0.0.0...
Run Code Online (Sandbox Code Playgroud)

谢谢.

haskell cabal

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

GHC偏好一个专业化而不是另一个专业化

我有一个Haskell类型类函数,如下所示:

class Foo m where
   foo :: Num a => m a -> a
Run Code Online (Sandbox Code Playgroud)

我要生成的两个专业foo,一个用于任何时间都m ~ X Int和其他的时候m ~ X Int, a ~ Int.我为此写了以下代码:

instance Foo (X a) where
   {-# SPECIALIZE instance Foo (X Int) #-}
   foo = ...
   {-# SPECIALIZE foo :: X Int Int -> Int #-}
Run Code Online (Sandbox Code Playgroud)

据我所知,在包含此代码的文件中,我得到了两个专业化.但是,在使用Foo它的模块中,似乎总是指向不太通用的特化,foo :: Num a => X Int a -> a即使是a ~ Int.

有没有办法告诉GHC更喜欢最专业的版本foo而不是部分专业版?

谢谢.

haskell ghc

10
推荐指数
0
解决办法
94
查看次数

传递类按值时,调用方或被调用方是否调用析构函数?

假设我有以下(经过精简的)代码:

class P { P(); P(const P&); ~P(); }

void foo(P x) {
  ...
}

void bar() {
  P p{};
  foo(p); // compiler uses P::(const P&) to construct the value for x
  ...
  // compiler calls P::~P() on p
}
Run Code Online (Sandbox Code Playgroud)

编译器必须创建的副本p才能调用foo,因此调用者在调用之前会调用副本构造函数。我的问题是,谁负责破坏这个创建的对象?似乎有两个有效的选择:

  1. 被调用方(即foo)在返回之前使用其所有按值参数调用析构函数,然后调用方释放内存(通过将其弹出堆栈)。
  2. The callee doesn't do anything, and the caller (i.e. bar) calls the destructor on all of the temporaries before the sequence point at the end of the foo(p) call.

c++ destructor language-lawyer

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

不同的隐式生成函数之间是否存在可观察到的语义差异?

我一直在阅读 C++ 标准,试图了解平凡、简单和隐式定义的构造函数/赋值运算符/析构函数之间是否存在任何可观察到的差异。从我目前的理解来看,似乎没有区别,但这似乎很奇怪,为什么在无关紧要的情况下花这么多时间定义它们?

作为一个特定的具体示例,请考虑复制构造函数。

  • 如果所有字段和基类都是平凡的,那么平凡复制构造函数会逐个字段地复制所有字段和基类。
  • 否则,隐式生成的复制构造函数:“按初始化顺序执行基本成员和非静态成员的完整成员副本”。

如果我理解正确,如果一个类具有所有琐碎的基础和字段,但具有默认的复制构造函数,那么默认的复制构造函数将与普通构造函数做完全相同的事情。甚至初始化顺序在这里似乎都不相关,因为这些字段都是不相交的(因为平凡意味着没有virtual基类)。

有没有一个例子,一个简单的复制构造函数会做一些与显式默认的复制构造函数不同的事情?

通常,相同的逻辑似乎也适用于其他构造函数和析构函数。由于数据竞争的可能性,分配的参数有点复杂,但如果类实际上是微不足道的,那么所有这些似乎都是标准未定义的行为。

c++ language-lawyer

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

具有动态依赖关系的细粒度构建?

我有兴趣了解 bazel 是否可以处理“两阶段构建”,其中根据文件内容发现依赖项,并且必须在依赖它们的代码之前编译依赖项(与 C/C++ 不同,其中依赖项主要是头文件,而不是单独编译)。具体来说,我正在构建类似于 Ocaml 的 Coq 语言。

我创建构建计划的直觉是使用一个(现有的)工具(称为coqdep)来读取文件并返回其所有直接.v依赖项的列表。这是我想到的算法:

  1. coqdep在目标文件和(传递地)其每个依赖文件上调用,
  2. 一旦计算出目标的传递依赖关系,就添加一条规则来构建包含传递依赖关系的.vo目标.v

理想情况下,对coqdep(步骤 1 中)的调用将在构建之间缓存,因此只需要在文件更改时重新计算。并且依赖信息的传递闭包也会被缓存。

是否可以在 bazel 中实现这个?是否有任何关于为此类语言设置构建的指示?天真地,它似乎是一个两阶段构建,我不确定这如何适合 bazel 的编译模型。当我查看 Ocaml 的规则时,它似乎依赖于ocamlbuild满足构建顺序和依赖关系要求,而不是在 bazel 中“本地”执行。

感谢您的任何指示或见解。

coq bazel bazel-rules

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

应该使用什么 C++ 构造来访问与另一个进程共享的内存

C++ 代码应该如何访问与另一个应用程序共享的内存,例如通过memmapd 文件?选项似乎是:

  1. 常规原始访问,例如int* p = ...address of shared memory...; *p = 5; *p. 这似乎是不安全的,因为允许编译器假设 的内容p是稳定的,但事实并非如此。
  2. 考虑这些操作的一种方法是它们是另一个进程的输入/输出,因此(至少在旧版本的 C++ 中)应该实现的方式似乎是使用volatile.
  3. 由于现代 C++ 包含内置的原子操作,另一种选择是使用原子。在实践中,编译器似乎并没有对这些操作做太多优化,但不清楚是否被标准禁止。

从实验来看,似乎 2 和 3 都在实践中工作(2 没有正确处理弱记忆的复杂性),但是否符合标准?我是否需要使用组合,即访问atomic<volatile int>

c++ language-lawyer c++14 c++17

5
推荐指数
0
解决办法
93
查看次数

Haskell相当于OCaml的Format库

Haskell有一个与OCaml(格式库)做同样事情的吗?或者,在Haskell中漂亮打印抽象语法树的最简单方法是什么?

谢谢.

ocaml haskell pretty-print

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