これがエラーになる理由を誰でも説明できますか:
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
これはしませんが:
Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]
これがエラーになる理由を誰でも説明できますか:
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
これはしませんが:
Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]
printfn の署名はPrintf.TextWriterFormat<'a> -> 'a
. コンパイラは文字列のリテラル値を推論しますがPrintf.TextWriterFormat<unit>
、動的文字列ではそうできません。
最初の例では、正しい型注釈を追加することでコンパイラを支援できます。
let xs: Printf.TextWriterFormat<unit> [] = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
または明示的なコンストラクターを使用します。
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (fun s -> printfn <| Printf.TextWriterFormat<unit>(s)) xs
一般に、これを行うには冗長すぎます。したがって、"%s"
文字列や"%O"
型オーバーライドToString()
メソッドなどのフォーマット文字列を指定するのが良い方法です。
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (printfn "%s") xs
@padの優れた回答に加えて。
混乱の主な理由は、引数で何が起こるかについての誤解です。単一の反復を見てみましょう。それはあるはずです
printfn "%s" "Mary" // or whatever default format specifier instead of %s
しかし、実際には
printfn "Mary" ()
したがって"Mary"
、フォーマットされる文字列ではありません。これは書式指定子であり、まったく役に立ちませんが、a の書式設定には適していunit
ます。
サンプルに次の変更を加えてみてください。
Array.iter printfn [| "Mary %s"; "Mungo"; "Midge" |]
コンパイルを拒否します。