2011-08-09 2 views
2

ここにはcustom processing on a format and its partsの情報があります。私は特に、私はの効果に何かをしたい、少しシンプルな何かをしたい:F#:書式化を可能にする文字列 - > unit関数を使用したsprintfの作成

let writelog : string -> unit = ... // write the string to the log 

let writelogf = sprintf >> writelog // write a formatted string to the log 

私は、コンパイラは、このことで混乱してしまうことにも驚いてないんだけど、それを得るためにどのような方法があります働く?

+0

あなたはこのを見てみたいことがあります。 logger.Info "Hello%s" "world" – Robert

答えて

12

printfのような書式設定の文字列を受け取り、独自の関数を定義する最も簡単な方法をwritelogfするために余分な引数である(セッションがFSIからである)作品Printf.kprintf機能を使用することです。 kprintfの最初の引数は(あなたがそれあなたのwritelog機能渡すことができるように)フォーマットした後、結果の文字列を表示するために使用される機能です。

let writelog (s:string) = printfn "LOG: %s" s 
let writelogf fmt = Printf.kprintf writelog fmt 

2番目の引数として渡されfmtパラメータは、特殊な形式です文字列。これは、jpalmerのソリューションより優れています。追加の引数をいくつか指定すると、それらは直接kprintfに渡されるため(引数の数はフォーマット文字列によって異なる可能性があります)。

あなたは書くことができます:https://github.com/robertpi/log4f:

> writelogf "Hello";; 
LOG: Hello 

> writelogf "Hello %d" 42;; 
LOG: Hello 42 
+0

Hahに強制しません。それはかなり簡単です。 –

1

これは

> let writelog = fun (s:string) -> printfn "%s" s;; 

val writelog : string -> unit 

> let writelogf arg = sprintf arg >> writelog;; 

val writelogf : Printf.StringFormat<('a -> string)> -> ('a -> unit) 

> writelogf "hello %s" "world";; 
hello world 
val it : unit =() 
> 

キーが

+0

"writelogf"には機能しません "Hello" ' – Ankur

+0

@ankur - これはlet t =と同じ問題です。こんにちは"; printf t - コンパイラは、文字列リテラルをフォーマット文字列型 –