在这里,我无法添加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)
请注意,我总是从向量中删除它,并且向量不会进一步重新排序,因此此操作应该是安全的.我认为很难说服编译器,但是有什么技巧可以达到同样的目的吗?
请注意以下代码:
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, ...),它需要一个完整的副本来擦除父函数堆栈中的数据并在被调用函数的堆栈上分配).
与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发送命令,但我不确定具体如何。指向相关文档的指针将不胜感激!
在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?
请注意以下功能:
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) 考虑以下类型的黑白二叉树:
\ndata BW = Black BW BW | White BW BW | Leaf Nat\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n例如,Black (White 0 1) (White 2 3)和White (Black 0 2) (Black 1 3)是等价的。我感兴趣的是尽可能有效地枚举给定大小的所有唯一树(其中树的大小只是构造函数的数量)。暴力方法仅涉及枚举给定深度的所有树,并过滤掉等效的树。由于以下两个原因,这将非常低效:
它将浪费地生成/考虑大量等效树
\n过滤将是二次的,因为它需要与所有以前的树进行比较
\n是否有一种有效的算法来生成给定深度的所有 BW 树,而不生成相同的树?
\n这个正则表达式
/\(.*\)/
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))
可能有无限级别的括号.
我正在开发一个node.js服务器应用程序.为了加快这个过程,我已经配置了我的编辑器,这样node <current_file>当我按下一个键时它将使用命令运行当前文件.问题是:编辑器在文件启动服务器时阻塞.如何更改该命令以便它在后台运行node.js?
假设您正在编写OST或网络纠错应用程序.因此,你正在处理一些缺少一些字母的单词,比如"*leph*nt".您将英语词典存储在数组中.你如何确定它是哪个单词?
algorithm complexity-theory artificial-intelligence neural-network
在Linux上,命令:
for f in *; do cp "$f" "$f"_copy; done
如预期,因为"_copy"字符串的文件扩展名后附加,成为不工作foo.png_copy来代替foo_copy.png.我如何解决它?我可以切片吗?
rust ×3
algorithm ×2
haskell ×2
parsing ×2
shell ×2
agda ×1
bash ×1
command-line ×1
enumeration ×1
linux ×1
macos ×1
performance ×1
regex ×1
string ×1
terminal ×1