F #의 printfn이 리터럴 문자열에서는 작동하지만 문자열 유형의 값은 작동하지 않는 이유는 무엇입니까?

대니 투 페니

다음 F # 코드에서; 나는 printfn세 번 호출 될 것으로 예상합니다 . 각각 문자열이 있습니다. 그러나 결론은 컴파일되지 않습니다 ( The type 'string' is not compatible with the type 'Printf.TextWriterFormat<'a>').

이것이 작동 할 수 있다는 것을 의미하는 처음 두 줄은 무엇입니까? 그들은 단지 문자열이 아닙니까?

open System

printfn ("\r\n") // Works
printfn ("DANNY") // Works
printfn (DateTime.Now.ToLongTimeString()) // Doesn't compile
남자 이름

F # 컴파일러는 전달하는 형식 문자열을 정적으로 분석하여 전달 printfn하는 인수가 사용하는 형식 지정자에 유효한지 확인합니다. 예를 들어 다음은 컴파일되지 않습니다.

printfn "%d" "some value"

string% d 형식 지정자와 호환되지 않기 때문 입니다. 컴파일러는 유효한 형식 문자열을 TextWriterFormat<T>.

임의의 문자열로는이를 수행 할 수 없으며 변환을 수행하지 않기 때문에 위의 유형 오류가 발생합니다.

그러나을 사용하여 직접 변환 할 수 있습니다 Printf.TextWriterFormat. 예를 들어 a 및를 필요로하는 형식 문자열의 string경우 int다음을 사용할 수 있습니다.

let f = Printf.TextWriterFormat<string -> int -> unit>("The length of '%s' is: %d")
printfn f "something" 9

문자열에 형식 자리 표시자가 없으므로 다음을 수행 할 수 있습니다.

let f = Printf.TextWriterFormat<unit>(DateTime.Now.ToLongTimeString())
printfn f

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관