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

  • 本文关键字:类型 注释 在这里 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

对于 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>没有区别。它们是完全相同的类型。

最新更新