小编Mai*_*tor的帖子

如果我刚刚将它弹回()后,我可以将引用推送到具有更长寿命的向量吗?

在这里,我无法添加thing到向量,因为它的生命周期不同于'a:

pub fn foo<'a>(vec: &'a mut Vec<&'a Thing>) {
    let thing: Thing = new_thing();
    vec.push(&thing);
    // do stuff with vec
    vec.pop();
}
Run Code Online (Sandbox Code Playgroud)

请注意,我总是从向量中删除它,并且向量不会进一步重新排序,因此此操作应该是安全的.我认为很难说服编译器,但是有什么技巧可以达到同样的目的吗?

rust

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

我可以将矢量移动到结构内而不完全复制吗?

请注意以下代码:

enum Store {
    Place { val: Vec<u8> },
}

fn subst(val: Vec<u8>, store: &mut Store) {
    *store = Store::Place { val }
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这里subst将移动val到内部store,这会导致它被复制.有没有办法这样做而不复制整个矢量?"复制"是指内存副本.我的理解是,当移动一个值时(例如vec调用时subst(vec, ...),它需要一个完整的副本来擦除父函数堆栈中的数据并在被调用函数的堆栈上分配).

performance rust

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

如何从命令行/其他语言使用Agda?

与Agda的大多数交互都是通过EMACS完成的,但是有没有办法以编程方式进行呢?即,是否可以通过命令行或某些API进行所有操作?主要目标是构建一个薄包装器,以便我们可以使用另一种语言来调用Agda,例如:

var Agda = require("agda");

var code = `
    data Bool: Set where
        true: Bool
        false: Bool

    not : Bool -> Bool
    not true = false
    not false = true

    val : Bool
    val = not true
`;

console.log(Agda.infer(code, "true")); // prints "Bool"
console.log(Agda.normalize(code, "val")); // prints "false"
Run Code Online (Sandbox Code Playgroud)

之前我曾经问过如何将Agda 用作库,但是显然只涉及Haskell。我尝试查看Agda的VIM扩展以了解其工作方式,似乎它正在向Agda发送命令,但我不确定具体如何。指向相关文档的指针将不胜感激!

agda

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

是否可以为解析相应Debug格式的任意类型派生解析器?

在Haskell中,作为语言特性,可以从字符串派生解析器到任意数据类型:这就是所谓的Read.Rust可以这么做吗?也就是说,给定一个任意的,enum例如:

#[derive(Debug)]
enum Foo {
    A { x: u32, s: String },
    B { v: Vec<u8> },
}
Run Code Online (Sandbox Code Playgroud)

并且,鉴于Rust包含Debug特征作为序列化任意数据类型的语言特性,是否也可以自动生成其相应的Parse特征?

换句话说,是否有一个默认的防锈功能,可以让我得到一个parse(&str) -> Foo这样的,对于任何字符串函数s要么parse(&s) == None还是format!("{:?}", parse(&s).unwrap()) == s

parsing rust

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

如何使用 do-notation 写一个延续传递风格的蹦床函数?

请注意以下功能:

range :: Int -> [Int]
range 0 = []
range n = (n - 1) : range (n - 1)
Run Code Online (Sandbox Code Playgroud)

我们可以将其转换为蹦床 CPS 函数:

data Trampoline a = Done a | Wrap (() -> Trampoline a)

call :: Trampoline a -> a
call (Done a) = a
call (Wrap f) = call (f ())

range :: Int -> [Int]
range n = call (loop n Done) where
  loop :: Int -> ([Int] -> Trampoline [Int]) -> Trampoline [Int]
  loop 0 …
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何有效地枚举二叉黑白树,同时考虑对称性?

考虑以下类型的黑白二叉树:

\n
data BW = Black BW BW | White BW BW | Leaf Nat\n
Run Code Online (Sandbox Code Playgroud)\n

具有如下等价关系:

\n
\xe2\x88\x80 a b c d . Black (White a b) (White c d) == White (Black a c) (Black b d)\n
Run Code Online (Sandbox Code Playgroud)\n

例如,Black (White 0 1) (White 2 3)White (Black 0 2) (Black 1 3)是等价的。我感兴趣的是尽可能有效地枚举给定大小的所有唯一树(其中树的大小只是构造函数的数量)。暴力方法仅涉及枚举给定深度的所有树,并过滤掉等效的树。由于以下两个原因,这将非常低效:

\n
    \n
  1. 它将浪费地生成/考虑大量等效树

    \n
  2. \n
  3. 过滤将是二次的,因为它需要与所有以前的树进行比较

    \n
  4. \n
\n

是否有一种有效的算法来生成给定深度的所有 BW 树,而不生成相同的树?

\n

algorithm haskell enumeration

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

是否有能够解析匹配符号的正则表达式?

这个正则表达式

/\(.*\)/
Run Code Online (Sandbox Code Playgroud)

将不匹配匹配的括号,但匹配字符串中的最后一个括号.是否有正则表达式扩展或类似的东西,具有适当的语法允许这个?例如:

there are (many (things (on) the)) box (except (carrots (and apples)))
Run Code Online (Sandbox Code Playgroud)

/OPEN(.*CLOSE)/ 应该匹配 (many (things (on) the))

可能有无限级别的括号.

regex string parsing

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

从OSX命令行运行不同线程中的程序?

我正在开发一个node.js服务器应用程序.为了加快这个过程,我已经配置了我的编辑器,这样node <current_file>当我按下一个键时它将使用命令运行当前文件.问题是:编辑器在文件启动服务器时阻塞.如何更改该命令以便它在后台运行node.js?

macos shell command-line multithreading

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

如果你遗漏了一些单词的字母,如何确定它是哪个单词?

假设您正在编写OST或网络纠错应用程序.因此,你正在处理一些缺少一些字母的单词,比如"*leph*nt".您将英语词典存储在数组中.你如何确定它是哪个单词?

algorithm complexity-theory artificial-intelligence neural-network

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

`for f in*; 做cp"$ f""$ f"_copy; 完成`不起作用,因为"foo.png_copy".怎么解决?

在Linux上,命令:

for f in *; do cp "$f" "$f"_copy; done

如预期,因为"_copy"字符串的文件扩展名后附加,成为不工作foo.png_copy来代替foo_copy.png.我如何解决它?我可以切片吗?

linux bash shell terminal

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