在 F# interactive 中,我可以找到 sprintf 的类型。
>sprintf;;
val it : (Printf.StringFormat<'a> -> 'a) = <fun:clo@163>
如果 curried 函数不是通用的,我可以使用第一个参数找到 sprintf curried 的类型。
> sprintf "%g";;
val it : (float -> string) = <fun:it@134-16>
但如果它是通用的,那么我会得到值限制错误。
> sprintf "%A";;
error FS0030: Value restriction. The value 'it' has been inferred to have generic type
val it : ('_a -> string)
Either make the arguments to 'it' explicit or, if you do not intend for it to be generic, add a type annotation.
我可以添加一个类型注释来摆脱像这样的值限制,专门针对一个类型的函数,例如。约会时间。
>let f : (DateTime -> string) = sprintf "%A";;
val f : (DateTime -> string)
如何在没有绑定的情况下添加类型注释?我尝试了以下...
>sprintf "%A" : (DateTime -> string);;
error FS0010: Unexpected symbol ':' in interaction. Expected incomplete structured construct at or before this point, ';', ';;' or other token.
这是一个类似的例子,但更难......
>sprintf "%a";;
error FS0030: Value restriction. The value 'it' has been inferred to have generic type
val it : ((unit -> '_a -> string) -> '_a -> string)
Either make the arguments to 'it' explicit or, if you do not intend for it to be generic, add a type annotation.