小编lje*_*drz的帖子

闭包何时实现Fn,FnMut和FnOnce?

哪些具体条件为闭合来实现Fn,FnMutFnOnce特质?

那是:

  • 闭包什么时候没有实现这个FnOnce特性?
  • 闭包什么时候没有实现这个FnMut特性?
  • 闭包什么时候没有实现这个Fn特性?

例如,改变它的主体上的闭包状态会使编译器无法实现Fn它.

closures rust

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

Rust生活

偶尔我发现自己想要编写可以通过以下两种方式之一调用的函数:

// With a string literal:
let lines = read_file_lines("data.txt");

// With a string pointer:
let file_name = ~"data.txt";
let lines = read_file_lines(file_name);
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是使用借用的指针(&str)作为参数类型,但是当它不起作用时(它只允许我使用@str~str),我尝试了以下(通过复制Rust库),这确实有效.

fn read_file_lines<'a>(path: &'a str) -> ~[~str] {
    let read_result = file_reader(~Path(path));
    match read_result {
        Ok(file) => file.read_lines(),
        Err(e) => fail!(fmt!("Error reading file: %?", e))
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我不明白我在做什么.从我可以收集的内容(主要来自编译器错误),我宣布一个没有限制的生命周期,并使用它来描述path参数(意味着任何生命周期都可以作为参数传递).

所以:

  • 我的理解是否模糊准确?
  • 什么是一生?我在哪里可以了解更多相关信息?
  • 在上面的例子中&str,类型参数和类型参数之间有什么区别&'a str
  • 虽然我在这,但是什么'self

(我正在使用Rust 0.7,如果它对答案有所影响)

lifetime rust

47
推荐指数
1
解决办法
9963
查看次数

为什么引入dyn语法?

Rust 1.27.0中引入了一种新语法 - dyn添加了关键字.

  // old => new
  Box<Foo> => Box<dyn Foo>
  &Foo => &dyn Foo
  &mut Foo => &mut dyn Foo
Run Code Online (Sandbox Code Playgroud)

它实际上做了什么以及它为什么被添加?

syntax keyword rust

23
推荐指数
1
解决办法
5597
查看次数

为什么Haskell的默认字符串实现是字符链表?

Haskell的默认String实现在速度和内存方面都不高效这一事实是众所周知的.据我所知[] lists,通常在Haskell中实现单链接列表和大多数小/简单数据类型(例如Int)它似乎不是一个非常好的主意,但因为String它似乎完全矫枉过正.关于此事的一些意见包括:

真实世界哈斯克尔

在像这样的简单基准测试中,即使用Python等解释语言编写的程序也可以胜过使用String一个数量级的Haskell代码.

Haskell中的高效字符串实现

由于String只是[Char],这是Char的链接列表,这意味着字符串的引用局部性较差,并且再次意味着字符串在内存中相当大,至少它是N*(21bits + Mbits)其中N是字符串的长度,M是指针的大小(...).字符串不太可能被编译器优化为循环等.

我知道Haskell的ByteStrings(和Arrays)有几种不同的风格,并且它们可以很好地完成工作,但我希望默认实现是最有效的.

TL; DR:为什么Haskell的默认String实现是单链表,即使它非常低效并且很少用于真实世界的应用程序(除了非常简单的应用程序)?有历史原因吗?实施起来更容易吗?

string performance haskell linked-list

21
推荐指数
2
解决办法
1752
查看次数

如何将数字提升到一个权力?

我试图使用插入符号运算符(^)将整数提升到一个幂,但我得到了令人惊讶的结果,例如:

assert_eq!(2^10, 8);
Run Code Online (Sandbox Code Playgroud)

搜索DuckDuckGo和谷歌没有透露任何相关信息.

如何在Rust中执行取幂?

operators exponentiation rust

18
推荐指数
4
解决办法
4106
查看次数

在Haskell中运算符&&严格吗?

例如,我有一个fnB :: a -> BoolfnA :: Bool返回之前没有意义的操作False.CI中可以将这两个操作组合在一个if块中:

if( fnA && fnB(a) ){ doSomething; }
Run Code Online (Sandbox Code Playgroud)

和C将保证fnBfnA返回false 之前不会执行.

但Haskell是惰性的,并且,通常也不能保证什么操作将首先执行,直到我们不使用seq,$!或别的东西,使我们的代码严格.一般来说,这就是我们需要快乐的事情.但是使用&&运算符,我希望fnBfnA返回结果之前不会对其进行求值.Haskell提供这样的保证&&吗?fnB即使fnA返回False,Haskell也会评估吗?

haskell logical-operators strictness

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

为什么Prelude的单词功能不是更简单?

考虑wordsPrelude功能; 它非常简单,可以用以下方式编写它:

words' :: String -> [String]
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
    (before, after) = break isSpace str
Run Code Online (Sandbox Code Playgroud)

但是,我注意到它的原始Prelude代码似乎更少......自然:

words                   :: String -> [String]
words s                 =  case dropWhile {-partain:Char.-}isSpace s of
                                "" -> []
                                s' -> w : words s''
                                      where (w, s'') =
                                             break {-partain:Char.-}isSpace s'
Run Code Online (Sandbox Code Playgroud)

我假设有与优化相关的原因.问题是:我错误地认为编译器应该words'像Prelude版本一样优化函数吗?我没有使用相同的功能(break,dropWhile,isSpace).

我曾经非常惊讶GHC没有执行一些最简单的低级优化:

C vs Haskell Collat​​z猜想速度比较

但除了这些{-partain:Char.-}位(这种情况下编译器的提示在IMO这种情况下似乎没有用),words代码似乎对于高级语言来说是不必要的.在这种情况下,它背后的原因是什么?

compiler-construction optimization haskell

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

新提出的Pin类型有哪些用例?

Pin不稳定的Rust中有一个新类型,RFC已经合并.据说传递引用时它被称为游戏改变者,但我不确定如何以及何时应该使用它.

任何人都可以用外行的话来解释它吗?

reference rust

14
推荐指数
2
解决办法
693
查看次数

C vs Haskell Collat​​z猜想速度比较

我的第一个真正的编程经验是Haskell.为了满足我的临时需求,我需要一个易于学习,编码快速且易于维护的工具,我可以说它很好地完成了工作.

然而,在某一点上,我的任务规模变得更大,我认为C可能更适合他们,而且确实如此.也许我在[任何]编程方面不够熟练,但我无法使Haskell像C一样快速高效,即使我听说适当的Haskell能够具有类似的性能.

最近,我想我会再次尝试一些Haskell,虽然它对于通用的简单(在计算方面)任务仍然很好,但它似乎无法将C的速度与Collat​​z猜想之类的问题相匹配.我读过了:

与Project Euler的速度比较:C vs Python vs Erlang vs Haskell

GHC优化:Collat​​z猜想

使用haskell进行collat​​z-list实现

但从我看到的,简单的优化方法,包括:

  • 选择"更严格"类型,如Int64而不是Integer
  • 改变GHC优化
  • 使用简单的优化技术,如避免不必要的计算或更简单的功能

仍然没有使Haskell代码甚至接近几乎相同(就方法而言)C代码的真正大数字.似乎唯一能使其性能与C [大规模问题]相媲美的方法是使用优化方法,使代码成为一个长期的,可怕的monadic地狱,这违背了Haskell(和我)非常重视的原则.

这是C版本:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int32_t col(int64_t n);

int main(int argc, char **argv)
{
    int64_t n = atoi(argv[1]), i;
    int32_t s, max;

    for(i = 2, max = 0; i <= n; ++i)
    {
        s = col(i);
        if(s > max) max = s;
    }
    printf("%d\n", max);

    return 0;
}

int32_t col(int64_t n)
{
    int32_t s;

    for(s = 0; ; ++s) …
Run Code Online (Sandbox Code Playgroud)

performance haskell

12
推荐指数
1
解决办法
1956
查看次数

Rust的布尔值和其他原始类型在哪里实现?

我会通过后面的一些鲁斯特的基本类型的代码,例如惊喜简单实现Option<T>怪异的宏观神奇的背后tuple,我能找到所有我在想要的类型libcore.除了一个 - bool.我在其他任何地方都找不到它.

boolRust 背后的代码在哪里?我知道这不是最新颖的类型,但我很惊讶我找不到它.

感谢Francis和rodrigo的回答,我注意到我为其他原语找到的代码只是它们的特征和相关的宏,而不是实际的实现.

Rust书中指出原语是内置于语言中的,但我对这种解释并不满意.他们什么时候建成?它可以追溯到Rust编译器最初使用Rust构建的时候还是在它仍然在OCaml中构建时发生的?是否存在任何相关代码?

primitive types rust

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