小编Mic*_*man的帖子

创建一个静态Haskell Linux可执行文件

这通常不是我喜欢的两件事,因为这些事情让我非常恼火(除了我的孩子).我在工作中编写了一个Haskell程序,它使用文本,xml-enumerator,attoparsec-text等库.我在工作的Windows机器上正常工作,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例.

我们的客户端运行的是CentOS 5.3,64位.我不能为我的生活让这个可执行文件正常运行.我尝试使用以下方法创建静态可执

ghc --make myprog.hs -optl-static -optl-pthread
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息:

openFile: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

我假设这与此处描述的错误有关.我尝试从32位和64位Ubuntu编译,尝试静态和共享版本,没有任何作用(虽然我偶尔会得到段错误而不是上面的错误消息).我可以尝试下载CentOS 5.3并为它创建一个虚拟机,但下载需要一段时间,而且我不确定哪个版本的GHC可以使用它(我尝试在他们的服务器上安装GHC 7,但我跑了进入libc问题).

在这一点上,我想出了一些可能的方法,但我想尽可能避免这些:

  • 用另一种语言重写(在Java中这样做的想法让我感到不安,尽管这可能是尝试Cal/OpenQuark的好时机).
  • 也许试试一个替代编译器,比如jhc.但是我不太确定如何开始在jhc中安装该程序的所有依赖项; 如果人们有经验并且知道jhc中的text/attoparsec/etc工作,我很乐意听到它.
  • 所有黑客攻击:构建Windows可执行文件,在其服务器上安装wine并以这种方式运行.

总而言之,这些是我真的希望我们有GHC的JVM后端的情况.我想我也可以试用LambdaVM.但我很想听听社区对这里做什么的建议.

linux haskell ld static-linking libraries

24
推荐指数
3
解决办法
8679
查看次数

在cabal沙箱中指定自定义远程仓库

我想在cabal沙箱中开展一个项目.但是remote-repo我不想使用与我的非沙盒代码(即Hackage)相同的代码,而是指向不同的远程仓库.我尝试cabal.configremote-repo一行在项目目录中创建一个文件,但似乎没有效果; cabal update之后运行表明正在下载Hackage,但不是我的自定义回购.

是否支持此用例,如果支持,我该如何实现?

haskell cabal

22
推荐指数
1
解决办法
724
查看次数

当Docker容器的PID1退出时,其他进程会发生什么?

考虑以下内容,它sleep 60在后台运行然后退出:

$ cat run.sh 
sleep 60&
ps
echo Goodbye!!!
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
    5 ?        00:00:00 sleep
    6 ?        00:00:00 ps
Goodbye!!!
Run Code Online (Sandbox Code Playgroud)

这将启动一个Docker容器,bash作为PID1.然后fork/execs一个sleep进程,然后bash退出.当Docker容器死亡时,该sleep过程也会以某种方式死亡.

我的问题是:该sleep过程被杀死的机制是什么?我试图陷入SIGTERM一个子进程,似乎没有被绊倒.我的假设是,SIGKILL当关闭容器正在使用的cgroup时,某些东西(Docker或Linux内核)正在发送,但我发现没有任何文档可以澄清这一点.

编辑我最接近解释的是baseimage-docker的以下引用:

如果您的init进程是您的应用程序,那么它可能只关闭自己,而不是容器中的所有其他进程.然后,内核将强制终止其他进程,而不是让他们有机会正常关闭,可能导致文件损坏,过时的临时文件等.您真的想要优雅地关闭所有进程.

因此,至少根据这一点,暗示当容器退出时,内核将向所有剩余进程发送SIGKILL.但是我仍然希望明确它如何决定这样做(即,它是cgroups的一个特征吗?),理想情况下,一个更权威的来源会很好.

linux cgroups docker

15
推荐指数
1
解决办法
1954
查看次数

具有类约束的GHC重写规则

我已经将以下重写规则添加到管道而没有问题:

{-# RULES "ConduitM: lift x >>= f" forall m f.
    lift m >>= f = ConduitM (PipeM (liftM (unConduitM . f) m))
  #-}
Run Code Online (Sandbox Code Playgroud)

我想增加一个类似重写规则liftIO以及

{-# RULES "ConduitM: liftIO x >>= f" forall m f.
    liftIO m >>= f = ConduitM (PipeM (liftM (unConduitM . f) (liftIO m)))
  #-}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,我从GHC收到以下错误消息:

Data/Conduit/Internal/Conduit.hs:1025:84:
    Could not deduce (Monad m) arising from a use of ‘liftM’
    from the context (Monad (ConduitM i o m), MonadIO (ConduitM i o m))
      bound by the …
Run Code Online (Sandbox Code Playgroud)

haskell ghc conduit

14
推荐指数
1
解决办法
403
查看次数

有效地将ByteString转换为十六进制表示

我需要能够给出SHA512哈希的十六进制表示.也许我只是看起来不够努力,但我可以在Hackage上找到任何功能来做到这一点.所以我写了一个实现使用unfoldrN.这对我的目的来说肯定足够快,但我想知道是否有人知道更快的方法.

我把我的实现作为一个要点放在Github上:https://gist.github.com/2356925.该文件还包括一个基于Numeric.showHexQuickCheck测试和标准基准的简单实现.我目前的简单版本与unfoldrN版本的结果是:

benchmarking simple
mean: 4.677296 ms, lb 4.656011 ms, ub 4.696684 ms, ci 0.950
std dev: 104.2791 us, lb 87.77023 us, ub 128.1627 us, ci 0.950
found 5 outliers among 100 samples (5.0%)
  4 (4.0%) low mild
variance introduced by outliers: 15.195%
variance is moderately inflated by outliers

benchmarking unfoldrN_MS1
mean: 370.0101 us, lb 365.9819 us, ub 373.8619 us, ci 0.950
std dev: 20.17016 us, lb 16.92772 us, ub …
Run Code Online (Sandbox Code Playgroud)

haskell bytestring

11
推荐指数
2
解决办法
1890
查看次数

使用haskell-src-exts解析UnicodeSyntax

我有一个使用Unicode语法的Haskell源文件:

{-# LANGUAGE UnicodeSyntax #-}
succ' :: Int ? Int
succ' = succ

main :: IO ()
main = print $ succ' 1
Run Code Online (Sandbox Code Playgroud)

这与GHC解析并运行良好.另外,Stylish-haskell和hlint(都基于haskell-src-exts)可以毫无困难地读取这个文件.但是,当我尝试使用haskell-src-exts解析它时:

import Language.Haskell.Exts (parseModule)

main = do
    x <- readFile "test.hs"
    print $ parseModule x
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 6, srcColumn = 1}) "TypeOperators is not enabled"
Run Code Online (Sandbox Code Playgroud)

但是,在扩展列表中显式提供UnicodeSyntax或使用parseFile工作正常:

import Language.Haskell.Exts

main = do
    x <- readFile "test.hs"
    print $ parseModuleWithMode defaultParseMode
        { extensions = [UnicodeSyntax]
        } x

    parseFile "test.hs" >>= print
Run Code Online (Sandbox Code Playgroud)

知道第一种方法失败的原因吗?

haskell haskell-src-exts

11
推荐指数
1
解决办法
461
查看次数

使用管道4.0折叠流的子集

我正在尝试理解管道4.0,并希望转换一些管道代码.假设我有一个Ints 流,我想跳过前五个,然后得到以下的总和5.使用普通列表,这将是:

sum . take 5 . drop 5
Run Code Online (Sandbox Code Playgroud)

在管道中,这将是:

drop 5
isolate 5 =$ fold (+) 0
Run Code Online (Sandbox Code Playgroud)

或者作为一个完整的程序:

import Data.Conduit
import Data.Conduit.List (drop, isolate, fold)
import Prelude hiding (drop)

main :: IO ()
main = do
    res <- mapM_ yield [1..20] $$ do
        drop 5
        isolate 5 =$ fold (+) 0
    print res
Run Code Online (Sandbox Code Playgroud)

但是,我不太确定如何使用管道来做到这一点.

haskell conduit haskell-pipes

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

如何将Text转换为bytestring Builder?

blaze-builder包提供了一个.Char.Utf8模块,该模块包括fromTextfromLazyText有效地将文本包中的blaze-builder Builder值转换为值.bytestring但是,使用新的Builder API ,不存在此类功能(因为bytestring不依赖于此功能text).我们可以解压缩Text值并使用stringUtf8,但这几乎肯定要慢得多.

另一种选择是使用blaze-builder,这是现在实际上只是一个包装周围bytestringBuilder类型,但我不知道是否有处理这个更习惯的方法.

haskell

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

为什么将值移动到闭包中仍然有错误消息“无法将不可变的局部变量借用为可变的”?

在下面的代码中,我明确地强制将namefrommain函数移动到闭包中,并且一切正常:

fn main() {
    let name = String::from("Alice");

    let welcome = || {
        let mut name = name;
        name += " and Bob";
        println!("Welcome, {}", name);
    };

    welcome();
}
Run Code Online (Sandbox Code Playgroud)

我原以为move在闭包的开头添加 a会完成同样的事情,并导致值被移动并创建 a FnOnce

fn main() {
    let name = String::from("Alice");

    let welcome = move || {
        name += " and Bob";
        println!("Welcome, {}", name);
    };

    welcome();
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到了错误消息:

fn main() {
    let name = String::from("Alice");

    let welcome = || {
        let mut name …
Run Code Online (Sandbox Code Playgroud)

rust

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

有没有办法传递对泛型函数的引用并返回与参数生命周期无关的 impl Trait?

我在网络应用程序中研究了一个现实生活中的示例,我使用不必要的堆分配解决了该示例,如下所示:

// Try replacing with (_: &String)
fn make_debug<T>(_: T) -> impl std::fmt::Debug {
    42u8
}

fn test() -> impl std::fmt::Debug {
    let value = "value".to_string();

    // try removing the ampersand to get this to compile
    make_debug(&value)
}

pub fn main() {
    println!("{:?}", test());
}
Run Code Online (Sandbox Code Playgroud)

照原样,编译这段代码给了我:

// Try replacing with (_: &String)
fn make_debug<T>(_: T) -> impl std::fmt::Debug {
    42u8
}

fn test() -> impl std::fmt::Debug {
    let value = "value".to_string();

    // try removing the ampersand to get …
Run Code Online (Sandbox Code Playgroud)

rust

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

PostgreSQL 全文搜索标题没有包含足够的上下文

我正在使用 PostgreSQL 的全文搜索功能在客户站点上实现搜索功能。我正在使用该ts_headline函数来获取搜索词出现的上下文,但客户对显示的单词选择不满意。特别是,标题似乎始终以搜索词开头,而客户希望它提前几个词开始。

有什么方法可以将 PostgreSQL 配置为具有这种行为,或者修改 ts_headline 调用以获得所需的结果?

编辑:抱歉,首先没有包含一些示例 SQL。

SELECT
    ts_headline('english', "text", plainto_tsquery('"endpoints"'))
FROM "Page"
WHERE to_tsvector("text") @@ plainto_tsquery('"endpoints"') 
ORDER BY ts_rank(to_tsvector("text"), plainto_tsquery('"endpoints"'))
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-search

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

Hyper 中的共享可变状态

我正在尝试在 Hyper Web 服务器中创建一个计数器来计算它收到的请求数。我正在使用 aArc<Mutex<u64>>来保持计数。但是,我一直无法弄清楚闭包的正确组合move.clone()满足闭包的类型。这是一些编译代码,但在每个请求上重置计数器:

extern crate hyper;

use hyper::rt::Future;
use hyper::service::service_fn_ok;
use hyper::{Body, Response, Server};
use std::sync::{Arc, Mutex};

fn main() {
    let addr = "0.0.0.0:3000".parse().unwrap();
    // FIXME want to create the counter here, not below
    let server = Server::bind(&addr)
        .serve(|| {
            service_fn_ok(|_req| {
                let counter = Arc::new(Mutex::new(0));
                use_counter(counter)
            })
        })
        .map_err(|e| eprintln!("Error: {}", e));
    hyper::rt::run(server)
}

fn use_counter(counter: Arc<Mutex<u64>>) -> Response<Body> {
    let mut data = counter.lock().unwrap();
    *data += 1;
    Response::new(Body::from(format!("Counter: {}\n", data))) …
Run Code Online (Sandbox Code Playgroud)

rust hyper rust-tokio

3
推荐指数
1
解决办法
760
查看次数

我可以从自定义类型借用切片吗?

可以将 a 借入Vec<u32>a&Vec<u32>或 a &[u32]。我认为这要归功于AsRefBorrow特质。但是,我无法在我自己的自定义类型上实现这种借用。我在这里吠错树了吗?

use std::borrow::Borrow;

struct MyArray([u32; 5]);

impl MyArray {
    fn new() -> MyArray {
        MyArray([42; 5])
    }
}

impl AsRef<[u32]> for MyArray {
    fn as_ref(&self) -> &[u32] {
        &self.0
    }
}

impl Borrow<[u32]> for MyArray {
    fn borrow(&self) -> &[u32] {
        &self.0
    }
}

fn main() {
    let ma = MyArray::new();
    let _: &[u32] = &ma; // compilation failure
}
Run Code Online (Sandbox Code Playgroud)

rust

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