Comma와의 F# Semantics
문제
나는 f#를 배우고있다. 나는 그것을 바라 보는 것으로 시작했다 F# 샘플 Microsoft에서.
나는이 진술을 가로 질러 달렸다.
let line1,line2 =
use sr = System.IO.File.OpenText @"test.txt"
let line1 = sr.ReadLine()
let line2 = sr.ReadLine()
(line1,line2)
누구 든지이 진술을 나에게 설명 할 수 있습니까?
여기서 어떤 유형이 정의되고 있습니까? 기능? 튜플?
왜 이렇게 line1
그리고 line2
정의 내에서 재정의해야합니다 line1,line2
(let line1 =
... let line2 =
)?
최종 라인은 무엇입니까? (line1, line2)
그리고 이것은 원래 정의의 유형과 어떻게 연결됩니까? 이것이 기능이 반환됩니까?
"진술"도 F#의 정의에 사용하기에 적합한 단어일까요?
감사.
해결책
F#의 결합 식별자 값에 대한 일반적인 형태는
let pattern = expression
이 경우 무늬 "line1, line2"입니다. 튜플 패턴으로, 그것은 값의 2- 튜플에 바인딩하고 이름 "line1"및 "line2"를이 두 값에 할당 할 것으로 예상됩니다.
그만큼 표현 다음 4 줄입니다. 그 표현 안에는 로컬 변수가 있습니다. 그것들은 또한 "line1"과 "line2"로 지명되었지만 "x"와 "y"또는 그 밖의 이름으로 쉽게 이름을 바꿀 수있었습니다. 해당 식별자의 범위는이 계약 된 표현에 국한됩니다. (외부 범위의 이름으로 동일한 이름이 사용된다는 사실은 컴파일러에 관한 한 영향을 미치지 않습니다.)
표현식이 표현식의 '반환 값'인 경우 마지막 줄. 이 경우 값의 2- 값 "line1"및 "line2"(또는 박람회의 명확성을 위해 이름을 바꾸는 경우 "x"및 "y"의 값을 반환합니다. 또한,이 두 값은 각각 유형 "문자열"을 가지기 때문에 리턴 표현식의 유형은 "String*string"이며, 이는 각 값이 문자열 인 2- 튜플입니다. 이것은 첫 번째 줄의 원래 "line1"및 "line2"이름이 각각 유형 "String"을 갖는 것으로 추론 함을 의미합니다.
F#은 기능적이므로 "모든 것이 표현입니다"와 "진술이 없습니다"(순차적으로 평가되는 표현 시퀀스 만) 그러나 (ab)라는 용어를 사용하여 "ab)을 사용하는 것은 괜찮습니다. 당신이 매우 정확하지 않으면 내면의 "let"라인.