Rust Nom:无法推断类型参数的类型

Rust Nom:无法推断类型参数的类型,rust,nom,Rust,Nom,我正在尝试使用的函数。本文档提供了以下示例: 使用nom::sequence::tuple; 使用nom::character::complete:{alpha1,digit1}; 让parser=tuple((alpha1,digit1,alpha1)); 当我尝试时,我得到一个编译错误: error[E0283]: type annotations needed --> src/main.rs:20:18 | 20 | let parser = tup

我正在尝试使用的函数。本文档提供了以下示例:

使用nom::sequence::tuple;
使用nom::character::complete:{alpha1,digit1};
让parser=tuple((alpha1,digit1,alpha1));
当我尝试时,我得到一个编译错误:

    error[E0283]: type annotations needed
   --> src/main.rs:20:18
    |
20  |     let parser = tuple((alpha1, digit1, alpha1));
    |         ------   ^^^^^ cannot infer type for type parameter `I` declared on the function `tuple`
    |         |
    |         consider giving `parser` a type
    | 
如果我想给变量添加一个类型,它会是什么?我知道它一定是FnMut的一些变体,但我不确定它到底是如何工作的

cargo.toml

[dependencies]
nom = ">=5.0"

类型推断需要足够的信息来实际推断类型。您可以通过复制文档中的完整示例来提供所需信息,包括两个
assert\u eq!()
语句:

use nom::sequence::tuple;
use nom::character::complete::{alpha1, digit1};
let mut parser = tuple((alpha1, digit1, alpha1));

assert_eq!(parser("abc123def"), Ok(("", ("abc", "123", "def"))));
assert_eq!(parser("123def"), Err(Err::Error(("123def", ErrorKind::Alpha))));
额外的调用将通知编译器由
tuple()
返回的函数的参数和返回类型,这反过来又为编译器提供足够的信息来推断
tuple()
调用的所有类型参数

或者,您可以显式地将类型参数传递给
tuple()
函数。以下是您需要提供的最少信息量,以便能够推断所有类型:

let _parser = tuple::<&str, _, (_, _), _>((alpha1, digit1, alpha1));
let_parser=tuple::((alpha1,digit1,alpha1));

请注意,关于类型推断如何在Rust中工作的详细信息不属于语言规范的一部分,并且可能会在Rust的未来版本中更改。虽然Rust具有很强的向后兼容性保证,但在升级到较新版本时,有时可能需要在代码中添加一些类型注释。

如果您确实从文档中复制了完整的示例,包括
assert\u eq!()
调用,它编译得很好。使用解析器的行为类型推断提供了所需的额外提示。谢谢,这很有意义。