f# - 为什么我需要一个类型注解?

标签 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> .它们是完全相同的类型。

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

相关文章:

list - F#中 "merge"多个相同长度列表的惯用方法?

dynamic - 使用 F# 在类/接口(interface)中动态定义多个成员

compiler-errors - 返回错误 FS0722 的多情况参数化事件模式仅返回一个结果的事件模式可以接受参数

.net - 用功能语言表示有状态的事物

F# 创建二维数组

f# - FSharp.Core 发行说明在哪里?

c# - 在 WPF Canvas 上的给定点居中文本

serialization - XNA和XBox的F#二进制序列化

f# - F#-我可以将类型名称用作充当默认构造函数的函数吗?

concurrency - 保证发送到邮箱处理器的消息的顺序