などの機能を部分的に適用bprintf
し、初期使用に基づいて制限されないようにすることはできますか?
私は次のことをしたいと思います:
let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder
append "%i" 10
append "%s" string_value
などの機能を部分的に適用bprintf
し、初期使用に基づいて制限されないようにすることはできますか?
私は次のことをしたいと思います:
let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder
append "%i" 10
append "%s" string_value
これを引き起こしている F# の側面は、値の制限と呼ばれます。F# Interactiveに 2 つの宣言だけを入力すると、次のことがわかりますlet
(コンパイラが最初の使用から型を推測しないようにするため)。
> let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder ;;
エラー FS0030: 値の制限。値 'append' はジェネリック型 val append を持つと推測されています: ('_a -> '_b) when '_a :> Printf.BuilderFormat<'_b> 'append' への引数を明示的にするか、そうでない場合はジェネリックにする場合は、型注釈を追加します。
詳細については、F# チームのDmitry Lomov による優れた記事があります。記事が示唆するように、1 つの解決策は、明示的な型パラメーター宣言を追加することです。
let builder = new System.Text.StringBuilder()
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder
append "%i" 10
append "%s" "Hello"
これで問題なく動作します。
明示的なフォーマット引数を追加できます
let builder = new System.Text.StringBuilder()
let append format = Printf.bprintf builder format
append "%i" 10
append "%s" "1"