사람이 설명해주십시오 수 printfn이 하다니F 번호는이 오류가 발생하는 이유 이상
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
하지 않습니다 : printfn의
Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]
사람이 설명해주십시오 수 printfn이 하다니F 번호는이 오류가 발생하는 이유 이상
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
하지 않습니다 : printfn의
Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]
서명은 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
를, 그렇게하는 것이 너무 자세한이다. @ 패드의 우수한 답변을뿐만 아니라
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (printfn "%s") xs
: 따라서, 형식 문자열을 지정 ToString()
메서드를 재정 유형과 같은 문자열을 "%s"
및 "%O"
갈 수있는 좋은 방법입니다.
혼란을 일으키는 주된 이유는 인수와 함께 일어나는 일에 대한 오해입니다. 단일 반복을 살펴 보겠습니다. 그것은
printfn "%s" "Mary" // or whatever default format specifier instead of %s
있지만, 사실은 있어야하는데, 그것은
printfn "Mary"()
그래서 "Mary"
포맷 할 문자열이 아닌 것입니다. 형식 지정자입니다. 쓸모가 없지만 unit
을 포맷하는 데 적합합니다.
Array.iter printfn [| "Mary %s"; "Mungo"; "Midge" |]
과 컴파일을 거부합니다.
패드의 설명 외에도 마지막 줄을 'Array.iter (printfn "% s") [| "Mary"; "Mungo"; "Midge"|]'. – wmeyer