Аспект F #, вызывающий это, называется ограничение значения .Вы можете увидеть, что если вы введете только два объявления let
в F # Interactive (чтобы компилятор не определял тип с первого использования):
> let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder ;;
error FS0030: Значениеограничение.Значение 'append' было выведено, чтобы иметь универсальный тип val append: ('_a ->' _b) когда '_a:> Printf.BuilderFormat <' _ b> Либо сделать аргументы для 'append' явными, либо, если вы ненамеревайтесь сделать его универсальным, добавьте аннотацию типа.
Есть отличная статья Дмитрия Ломова из команды F #, которая объясняет это подробно.Как предлагается в статье, одним из решений является добавление явного объявления параметра типа:
let builder = new System.Text.StringBuilder()
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder
append "%i" 10
append "%s" "Hello"
Это будет работать просто отлично.