7

などの機能を部分的に適用bprintfし、初期使用に基づいて制限されないようにすることはできますか?

私は次のことをしたいと思います:

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

3 に答える 3

12

これを引き起こしている 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"

これで問題なく動作します。

于 2010-10-28T21:35:03.923 に答える
9

明示的なフォーマット引数を追加できます

let builder = new System.Text.StringBuilder()
let append format = Printf.bprintf builder format
append "%i" 10
append "%s" "1"
于 2010-10-28T21:30:02.917 に答える
6

F# 値の制限が発生しています。

いくつかの回避策の適切な説明は次のとおりです: F# 値制限エラーの理解

その背後にある理由を説明するかなり詳細な記事を次に示します。リンク

于 2010-10-28T21:35:30.423 に答える