我在使用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类型类函数,如下所示:
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而不是部分专业版?
谢谢.
假设我有以下(经过精简的)代码:
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,因此调用者在调用之前会调用副本构造函数。我的问题是,谁负责破坏这个创建的对象?似乎有两个有效的选择:
foo)在返回之前使用其所有按值参数调用析构函数,然后调用方释放内存(通过将其弹出堆栈)。bar) calls the destructor on all of the temporaries before the sequence point at the end of the foo(p) call.我一直在阅读 C++ 标准,试图了解平凡、简单和隐式定义的构造函数/赋值运算符/析构函数之间是否存在任何可观察到的差异。从我目前的理解来看,似乎没有区别,但这似乎很奇怪,为什么在无关紧要的情况下花这么多时间定义它们?
作为一个特定的具体示例,请考虑复制构造函数。
如果我理解正确,如果一个类具有所有琐碎的基础和字段,但具有默认的复制构造函数,那么默认的复制构造函数将与普通构造函数做完全相同的事情。甚至初始化顺序在这里似乎都不相关,因为这些字段都是不相交的(因为平凡意味着没有virtual基类)。
有没有一个例子,一个简单的复制构造函数会做一些与显式默认的复制构造函数不同的事情?
通常,相同的逻辑似乎也适用于其他构造函数和析构函数。由于数据竞争的可能性,分配的参数有点复杂,但如果类实际上是微不足道的,那么所有这些似乎都是标准未定义的行为。
我有兴趣了解 bazel 是否可以处理“两阶段构建”,其中根据文件内容发现依赖项,并且必须在依赖它们的代码之前编译依赖项(与 C/C++ 不同,其中依赖项主要是头文件,而不是单独编译)。具体来说,我正在构建类似于 Ocaml 的 Coq 语言。
我创建构建计划的直觉是使用一个(现有的)工具(称为coqdep)来读取文件并返回其所有直接.v依赖项的列表。这是我想到的算法:
coqdep在目标文件和(传递地)其每个依赖文件上调用,.vo目标.v。理想情况下,对coqdep(步骤 1 中)的调用将在构建之间缓存,因此只需要在文件更改时重新计算。并且依赖信息的传递闭包也会被缓存。
是否可以在 bazel 中实现这个?是否有任何关于为此类语言设置构建的指示?天真地,它似乎是一个两阶段构建,我不确定这如何适合 bazel 的编译模型。当我查看 Ocaml 的规则时,它似乎依赖于ocamlbuild满足构建顺序和依赖关系要求,而不是在 bazel 中“本地”执行。
感谢您的任何指示或见解。
C++ 代码应该如何访问与另一个应用程序共享的内存,例如通过memmapd 文件?选项似乎是:
int* p = ...address of shared memory...; *p = 5; *p. 这似乎是不安全的,因为允许编译器假设 的内容p是稳定的,但事实并非如此。volatile.从实验来看,似乎 2 和 3 都在实践中工作(2 没有正确处理弱记忆的复杂性),但是否符合标准?我是否需要使用组合,即访问atomic<volatile int>?
c++ ×3
haskell ×3
bazel ×1
bazel-rules ×1
c++14 ×1
c++17 ×1
cabal ×1
coq ×1
destructor ×1
ghc ×1
ocaml ×1
pretty-print ×1