在以下代码中:

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

关于f# - 为什么这里需要类型注释?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30822725/

10-12 06:06