小编lje*_*drz的帖子

在readFile之后Haskell文件会自动关闭吗?

我想使用Haskell函数

readFile :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)

将文件的内容读入字符串.在文档中,我读到"文件是按需读取的,与getContents一样."

我不确定我完全理解这一点.例如,假设我写

s <- readFile "t.txt"
Run Code Online (Sandbox Code Playgroud)

执行此操作时:

  • 该文件已打开.
  • s中的字符实际上是从文件中读取的,但是需要它们来评估某些表达式(例如,如果我评估文件的length s 所有内容将被读取并且文件将被关闭).
  • 一旦读取了最后一个字符,readFile就会关闭与此调用相关联的文件句柄(自动).

我的第三个陈述是否正确?那么,我可以在readFile不关闭文件句柄的情况下调用吗?只要我没有消耗(访问)整个结果字符串,句柄是否会保持打开状态?

编辑

以下是有关我的疑虑的更多信息.假设我有以下内容:

foo :: String -> IO String
foo filename = do
                  s <- readFile "t.txt"
                  putStrLn "File has been read."
                  return s
Run Code Online (Sandbox Code Playgroud)

putStrLn执行时,我会(直觉地)期望

  1. s包含文件的全部内容t.txt,
  2. 用于读取文件的句柄已关闭.

如果不是这样的话:

  • 什么s时候putStrLn执行包含什么?
  • putStrLn执行时文件句柄处于什么状态?
  • 如果putStrLn执行的时间s不包含文件的全部内容,实际上何时会读取此内容,何时关闭文件?

io haskell lazy-evaluation

7
推荐指数
2
解决办法
1504
查看次数

何时以及如何使用引用向量

此代码正确编译.它有一些未使用的代码警告,但现在没问题.

use std::collections::BTreeMap;

enum Object<'a> {
    Str(String),
    Int(i32),
    Float(f32),
    Vector(Vec<&'a Object<'a>>),
    Prim(fn(State) -> State)
}

struct State<'a> {
    named: BTreeMap<String, &'a Object<'a>>,
    stack: Vec<Object<'a>>

}

impl<'a> State<'a> {
    fn push_int(&mut self, x: i32) {
        self.stack.push(Object::Int(x));
    }
}


fn main() {
    println!("Hello, world!");
    let obj = Object::Str("this is a test".to_string());
}
Run Code Online (Sandbox Code Playgroud)

这段代码的重要部分是push_intstack: Vec<Object<'a>>.

我正在尝试制作基于堆栈的VM.我想将状态传递给函数,函数可以从堆栈中取出东西,操作东西,然后将一些东西放回堆栈; 命名字段将保存命名对象.

我有一种预感,将堆栈表示为Vec<&'a Object<'a>>替代会更好.我现在拥有它的方式,我担心我会犯一些效率低下的错误.我的预感是正确的吗?

问题的第二部分是我不知道如何使引用版本的矢量工作.以适当的生命周期创建新值以推入堆栈对我来说不起作用.

我对这个问题有点模糊,所以如果我一直不清楚,请问我问题以清除问题.

reference vector rust

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

在公司代理后面的Windows上的货物

我认为这对于那些想在工作中使用Cargo with Windows的人来说是一个非常普遍的问题; 我看过多个与它相关的GitHub问题和论坛帖子,但没有一个答案解决了我的问题.

每当我尝试构建一些指向crates.io包的代码时,我都会收到以下错误:

 Downloading <package>
error: unable to get packages from source

Caused by:
  failed to download package <package> from <package address>

Caused by:
  SSL connect error
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?我知道Cargo可以使用设置,.cargo/config并且代理详细信息可以包含在那里,但它不适用于我,无论是否指定证书的路径(我使用的是curl分发的路径),如下所示:

[http]
proxy = "http://user:password@proxy-address.xyz:port"
cainfo = "cert.pem"

[https]
proxy = "https://user:password@proxy-address.xyz:port"
cainfo = "cert.pem"
Run Code Online (Sandbox Code Playgroud)

配置文件中指定的代理适用于任何其他目的.

我正在使用Windows 7 64bit,Rust 1.11 GNU和Cargo捆绑它.我怎样才能使这个工作?目前,我不得不从他们的存储库中手动下载包来源paths = [...],并在Cargo配置文件中指定每个来源.

proxy rust rust-cargo

6
推荐指数
2
解决办法
1829
查看次数

为什么这个Haskell代码这么慢?

我是Haskell的新手,并尝试制作拼字游戏解算器.它接收您当前拥有的字母,查找它们的所有排列并过滤掉那些字典单词.代码非常简单:

import Data.List

main = do
    dict    <- readFile "words"
    letters <- getLine
    let dictWords = words dict
    let perms = permutations letters
    print [x | x <- perms, x `elem` dictWords]
Run Code Online (Sandbox Code Playgroud)

然而,与我使用Python的非常类似的实现相比,它的速度非常慢.有什么根本我做错了吗?

*编辑:这是我的Python代码:

from itertools import permutations

letters = raw_input("please enter your letters (without spaces): ")

d = open('words')
dictionary = [line.rstrip('\n') for line in d.readlines()]
d.close()

perms = ["".join(p) for p in permutations(letters)]

validWords = []

for p in perms:
    if p in dictionary: validWords.append(p)


for validWord in …
Run Code Online (Sandbox Code Playgroud)

python optimization haskell language-comparisons

6
推荐指数
2
解决办法
476
查看次数

Rust 条件编译属性覆盖了多少行?

我正在尝试使用条件编译语句。除了定义一个只应存在于调试版本中的函数之外,我想定义一组仅存在于调试版本中的变量/常量/类型。

#[cfg(debug)]
pub type A = B;
pub type B = W;

#[cfg(other_option)]
pub type A = Z;
pub type B = I;
let test = 23i32;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,条件编译属性实际上“覆盖”了多少行?它只有一个(在这种情况下我会期望什么)?有没有办法确保整个代码块(包括变量、类型和两个函数)都被条件覆盖?

conditional-compilation rust

6
推荐指数
2
解决办法
2811
查看次数

为什么我无法从 &amp;'a T 返回 fmt::Arguments&lt;'a&gt; ?

根据我对生命周期的理解,如果函数的调用者在参数上指定生命周期,我可以返回具有该生命周期的类型。

即使有省略,这也是有效的:

pub fn substr(s: &str) -> &str {
    &s[0..1]
}

pub fn substr_ex<'a>(s: &'a str) -> &'a str {
    &s[0..1]
}
Run Code Online (Sandbox Code Playgroud)

但这并没有:

use std::fmt::Arguments;

pub fn as_format_arg<'a, T: 'a + ?Sized + Debug>(t: &'a T) -> Arguments<'a> {
    format_args!("{:?}", t)
}
Run Code Online (Sandbox Code Playgroud)
pub fn substr(s: &str) -> &str {
    &s[0..1]
}

pub fn substr_ex<'a>(s: &'a str) -> &'a str {
    &s[0..1]
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?还是我对生命的理解有误?

婴儿围栏:https://play.rust-lang.org/ ?gist=5a7cb4c917b38e012f20c771893f8b3b&version=nightly

lifetime rust

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

在没有重新分配的情况下将Vec转换为FFI的正确方法是什么?

我需要Vec在FFI中传递一些元素.通过实验,我发现了一些有趣的观点.我开始给FFI所有3 ptr,lencapacity这样我就可以重建Vec后销毁它:

let ptr = vec.as_mut_ptr();
let len = vec.len();
let cap = vec.capacity();
mem::forget(vec);
extern_fn(ptr, len, cap);

// ...

pub unsafe extern "C" fn free(ptr: *mut u8, len: usize, cap: usize) {
    let _ = Vec::from_raw_parts(ptr, len, cap);
}
Run Code Online (Sandbox Code Playgroud)

我想摆脱capacity它,因为它对我的前端没用; 它只是为了让我可以重建我的矢量来释放记忆.

Vec::shrink_to_fit()这很有吸引力,因为它似乎消除了处理能力的需要.不幸的是,关于它的文档并不能保证它会产生len == capacity,因此我认为在期间from_raw_parts()可能会触发未定义的行为.

into_boxed_slice()似乎有一个保证,它将len == capacity文档中产生,所以我接下来使用它.如果我错了,请纠正我.问题是它似乎不能保证不重新分配.这是一个简单的程序:

fn main() {
    let mut v = Vec::with_capacity(1000);
    v.push(100u8); …
Run Code Online (Sandbox Code Playgroud)

vector ffi rust

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

我可以只为集成测试和/或基准测试公开对象吗?

正如The Book所建议的那样,我已将板条箱中的集成测试移动到一个tests目录中。但是,其中一些测试使用了我不想导出到 crate 之外的函数,而且我无法再在集成测试文件夹中使用它们。我也将它们用于非测试目的,因此它们也需要在测试之外进行编译。我尝试使用 的变体pub(restricted),但无法使其工作。理想情况下,我想要像pub(tests).

目录树(相关位):

my_crate
|- src
   |- parser.rs
|- tests
   |- parsing.rs
|- benches
   |- parsing.rs
Run Code Online (Sandbox Code Playgroud)

测试/解析.rs:

extern crate my_crate;

use my_crate::parser::foo;

#[test]
fn temp() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

长凳/解析.rs:

#![feature(test)]
extern crate test;
extern crate my_crate;

use test::Bencher;
use my_crate::parser::foo;

#[bench]
fn temp(b: &mut Bencher) {
    b.iter(|| { foo(); });
}
Run Code Online (Sandbox Code Playgroud)

我目前的解决方法是pub在文档 ( #[doc(hidden)])中使相关对象保持可见和不可见,但这并没有传达正确的意图。我可以出于集成测试/基准测试的目的公开对象吗?

integration-testing module rust rust-cargo

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

如果我没有指定数字的类型,为什么count_ones不起作用?

为什么我需要显式声明i32一个数字的类型才能使用count_ones它?

fn main() {
    let x: i32 = 5;
    println!("{}", x.count_ones());
}
Run Code Online (Sandbox Code Playgroud)

如果我写了let x = 5;我会得到一个错误no method named 'count_ones' found for type '{integer}' in the current scope.为什么不这样做?

methods integer rust

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

通过FFI在C和Haskell之间传递类似结构的数据

考虑一个看起来像这样的Haskell数据类型

data MyData = MyData { arrInt :: [Int] , arrDouble :: [Double], arraySize :: N }
Run Code Online (Sandbox Code Playgroud)

这里N表示MyData记录的两个数组的大小.

是否可以将此(或MyData对象的某种Haskell"指针")传递给看起来像这样的C函数.

int myfunc (int* a, double* b, int N)
Run Code Online (Sandbox Code Playgroud)

我能够使用FFI来调用接受和返回简单数据类型的C函数,如Double,Int,Char等.但对于更复杂的类型,我不知道该怎么做.

c haskell ffi

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