El aspecto de F # que está causando esto se llama restricción valor. Se puede ver que si se introduce sólo los dos let
declaraciones a F # Interactivo (para que el compilador no infiere el tipo desde el primer uso):
> let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder ;;
error FS0030: Valor restricción. Se ha inferido que el valor 'append' tiene apend genérico de tipo val ('_a ->' _b) cuando '_a:> Printf.BuilderFormat <' _b> O bien explicita los argumentos para 'anexar' o, si no tiene la intención de ser genérico, agregue una anotación de tipo.
Hay un excellent article by Dmitry Lomov del equipo F # que lo explica en detalle. Como sugiere el artículo, una solución es agregar declaración explícita de parámetro de tipo:
let builder = new System.Text.StringBuilder()
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder
append "%i" 10
append "%s" "Hello"
Esto funcionará bien.
Gracias. ¿Alguien puede explicar por qué esto funciona y la aplicación parcial no? – Daniel
Porque en .NET, las funciones pueden ser genéricas y las variables no. 'let append format =' describe una función; 'let append =' describe una variable. –