相关疑难解决方法(0)

"你不明白欣德利 - 米尔纳的哪一部分?"

发誓曾经有一件T恤出售,上面写着不朽的话:


什么部分

辛德米尔纳

明白吗?


就我而言,答案就是......全部!

特别是,我经常在Haskell论文中看到这样的符号,但我不知道它的含义是什么.我不知道它应该是什么样的数学分支.

我当然认识到希腊字母的字母,以及诸如"∉"之类的符号(通常意味着某些东西不是一组的元素).

另一方面,我以前从未见过"⊢"(维基百科称它可能意味着"分区").我也不熟悉这里使用的vinculum.(通常它表示一个级分,但是这并不出现在这里是这种情况.)

如果有人至少可以告诉我从哪里开始想要理解这个符号海洋的含义,那将会有所帮助.

haskell functional-programming lambda-calculus hindley-milner denotational-semantics

832
推荐指数
6
解决办法
9万
查看次数

为什么在变量上调用方法会阻止Rust推断变量的类型?

此代码编译:

#[derive(Debug, Default)]
struct Example;

impl Example {
    fn some_method(&self) {}
}

fn reproduction() -> Example {
    let example = Default::default();
    // example.some_method();
    example
}
Run Code Online (Sandbox Code Playgroud)

如果添加了注释行,则会导致错误:

#[derive(Debug, Default)]
struct Example;

impl Example {
    fn some_method(&self) {}
}

fn reproduction() -> Example {
    let example = Default::default();
    // example.some_method();
    example
}
Run Code Online (Sandbox Code Playgroud)

为什么添加此方法调用会导致类型推断失败?

我看过以下两个问题:

从他们那里,我知道Rust使用的是Hindley-Milner 的(修改的)版本。后一个问题的答案将Rust的类型推论描述为一个方程系统。另一个答案明确指出“ Rust中的类型信息可以倒流”。

使用适用于这种情况的知识,我们可以:

  1. example 是类型 ?E
  2. ?E 必须有一个称为 some_method
  3. ?E 返回
  4. 返回类型为 Example

向后工作,很容易使人看到?E …

type-systems type-inference hindley-milner rust

30
推荐指数
2
解决办法
688
查看次数

如何将枚举值与整数匹配?

我可以得到这样的枚举的整数值:

enum MyEnum {
    A = 1,
    B,
    C,
}

let x = MyEnum::C as i32;
Run Code Online (Sandbox Code Playgroud)

但我似乎无法做到这一点:

match x {
    MyEnum::A => {}
    MyEnum::B => {}
    MyEnum::C => {}
    _ => {}
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能匹配枚举值或尝试转换xMyEnum

我可以看到这样的函数对枚举很有用,但它可能不存在:

impl MyEnum {
    fn from<T>(val: &T) -> Option<MyEnum>;
}
Run Code Online (Sandbox Code Playgroud)

rust

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

为什么 Rust 无法正确推断类型?

为什么这个工作正常:

let items = [1, 2, 3];
let mut cumulator = 0;

for next in items.iter() {
    cumulator += next;
}

println!("Final {}", cumulator);
Run Code Online (Sandbox Code Playgroud)

但这失败了?:

let items = [1, 2, 3];
let mut cumulator = 0;

for next in items.iter() {
    cumulator += next.pow(2);
}

println!("Final {}", cumulator);
Run Code Online (Sandbox Code Playgroud)

错误.pow(2)

no method named `pow` found for reference `&{integer}` in the current scope
method not found in `&{integer}`rustc (E0599)
Run Code Online (Sandbox Code Playgroud)

我的 IDE 标识next为 i32,第一个代码示例工作正常。next.pow()但是当我引用或 上的任何函数时,编译器就会出现问题next。编译器抱怨这 …

rust

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