map_res!
ожидает функцию, которая возвращает Result
в качестве второго аргумента, поэтому map_res!
назван так.Вы также можете увидеть его в «type» в документе nom:
map_res!(I -> IResult<I,O>, O -> Result<P>) => I -> IResult<I, P>
Однако, String::from
не возвращает результат;поэтому String::from(s)
неправильный тип для map_res!
.Вместо этого вы должны использовать обычный map!
, который имеет этот «тип» map!(I -> IResult<I,O>, O -> P) => I -> IResult<I, P>
:
#[macro_use]
extern crate nom;
use nom::types::CompleteStr;
use nom::alpha;
named!(letter_cs<CompleteStr,String>,
map!(
alpha,
|CompleteStr(s)| String::from(s)
)
);