Семантика оператора let в F# с запятой
Вопрос
Я изучаю F#.Я начал с просмотра Образцы F# от Майкрософт.
Я наткнулся на это утверждение:
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
В этом случае шаблон это «строка1, строка2», которая является кортеж шаблон, он будет ожидать привязки к кортежу из двух значений и присваивать этим двум значениям имена «line1» и «line2».
А выражение это следующие 4 строки.Внутри этого выражения есть локальные переменные.Их также называют «line1» и «line2», но их легко можно было переименовать в «x» и «y» или как-то еще — область действия этих идентификаторов является локальной для этого выражения с отступом.(Тот факт, что те же имена используются в качестве имен во внешней области, не имеет никакого влияния на компилятор.)
Последняя строка, если выражение является «возвращаемым значением» выражения.В этом случае он возвращает кортеж из двух значений «line1» и «line2» (или «x» и «y», если вы переименуете их для ясности изложения).Кстати, поскольку каждое из этих двух значений имеет тип «строка», тип возвращаемого выражения — «строка*строка», то есть кортеж из двух чисел, где каждое значение является строкой.Это означает, что исходные имена «line1» и «line2» в первой строке будут считаться имеющими тип «строка».
F# функционален, и поэтому в некотором смысле «все является выражением» и «нет никаких операторов» (только последовательности выражений, которые последовательно оцениваются), но IMO нормально (ab) использовать термин «оператор» для описания внутренние линии «let», если только вы не пытаетесь быть очень точным.