为什么我需要这里的类型注释?

Con*_*cer 3 f#

在以下代码中:

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
Run Code Online (Sandbox Code Playgroud)

使用f的类型注释,ThenBind的类型是:

p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> Parser<'b>) ->
input:string -> ParseResult<'b>
Run Code Online (Sandbox Code Playgroud)

但没有注释,它是:

p:(string -> ParseResult<'a>) ->
f:(Option<'a> -> string -> ParseResult<'b>) ->
input:string -> ParseResult<'b>
Run Code Online (Sandbox Code Playgroud)

为什么?

sep*_*p2k 8

您不需要类型注释.这两种类型是相同的.

Parser<'a>只是一个别名string -> ParseResult<'a>,所以结果类型f是否声明为Parser<'b>或没有区别string -> ParseResult<'b>.它们是完全相同的类型.