为什么这里需要类型注解?
Why do I need a type annotation here?
在下面的代码中:
type ParseResult<'a> =
{
Result : Option<'a>;
Rest : string
}
type Parser<'a> = string -> ParseResult<'a>
let ThenBind p (f : Option<'a> -> Parser<'b>) : Parser<'b> =
fun input ->
let r = p input
match r.Result with
| None -> { Result = None; Rest = input }
| _ -> (f r.Result) r.Rest
使用 f 的类型注释,ThenBind 的类型是:
p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> Parser<'b>) ->
input:string -> ParseResult<'b>
但是没有注释,它是:
p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> string -> ParseResult<'b>) ->
input:string -> ParseResult<'b>
为什么?
您不需要类型注释。两种类型完全相同。
Parser<'a>
只是一个别名string -> ParseResult<'a>
,所以f
的结果类型声明为Parser<'b>
还是string -> ParseResult<'b>
没有区别。它们是完全相同的类型。
在下面的代码中:
type ParseResult<'a> =
{
Result : Option<'a>;
Rest : string
}
type Parser<'a> = string -> ParseResult<'a>
let ThenBind p (f : Option<'a> -> Parser<'b>) : Parser<'b> =
fun input ->
let r = p input
match r.Result with
| None -> { Result = None; Rest = input }
| _ -> (f r.Result) r.Rest
使用 f 的类型注释,ThenBind 的类型是:
p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> Parser<'b>) ->
input:string -> ParseResult<'b>
但是没有注释,它是:
p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> string -> ParseResult<'b>) ->
input:string -> ParseResult<'b>
为什么?
您不需要类型注释。两种类型完全相同。
Parser<'a>
只是一个别名string -> ParseResult<'a>
,所以f
的结果类型声明为Parser<'b>
还是string -> ParseResult<'b>
没有区别。它们是完全相同的类型。