保留部分应用功能通用

问题描述:

是否可以部分应用bprintf等功能,并根据其初始用途防止其受到限制?保留部分应用功能通用

我想做到以下几点:

let builder = new System.Text.StringBuilder() 
let append = Printf.bprintf builder 
append "%i" 10 
append "%s" string_value 

可以增加明确格式参数

let builder = new System.Text.StringBuilder() 
let append format = Printf.bprintf builder format 
append "%i" 10 
append "%s" "1" 
+0

感谢。任何人都可以解释为什么这个工程和部分应用程序不? – Daniel 2010-10-28 21:31:10

+10

因为在.NET中,函数可以是通用的,而变量不能。 'let append format ='描述一个函数; 'let append ='描述一个变量。 – 2010-10-28 21:34:06

F#是造成这被称为值限制的方面。你可以看到,如果你只输入两个let声明,以F#互动(这样编译器不会从第一次使用推断出类型):

> let builder = new System.Text.StringBuilder() 
    let append = Printf.bprintf builder ;; 

错误FS0030:值限制。当'_a:> Printf.BuilderFormat <'_b> 'append'被推断为具有 泛型类型val append:('_a - >'_b)或者,如果您不打算为 它是通用的,添加一个类型注释。

有一个来自F#团队的excellent article by Dmitry Lomov详细解释它。正如文章所建议的,一种解决方案是添加明确的类型参数声明:

let builder = new System.Text.StringBuilder() 
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder 
append "%i" 10 
append "%s" "Hello" 

这将工作得很好。

您遇到F#值限制。

下面是一些解决方法的一个很好的解释:Understanding F# Value Restriction Errors

这是一个相当深入的文章,解释其背后的原因:http://blogs.msdn.com/b/mulambda/archive/2010/05/01/value-restriction-in-f.aspx