2012-07-29 3 views
3

사람이 설명해주십시오 수 printfn이 하다니F 번호는이 오류가 발생하는 이유 이상

let xs = [| "Mary"; "Mungo"; "Midge" |] 

Array.iter printfn xs 

하지 않습니다 : printfn의

Array.iter printfn [| "Mary"; "Mungo"; "Midge" |] 
+2

패드의 설명 외에도 마지막 줄을 'Array.iter (printfn "% s") [| "Mary"; "Mungo"; "Midge"|]'. – wmeyer

답변

7

서명은 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 
3

: 따라서, 형식 문자열을 지정 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" |] 

과 컴파일을 거부합니다.

관련 문제