Общая форма для привязки значений идентификатора в F #:
let pattern = expression
В этом случае шаблон представляет собой "line1, line2", который является шаблоном tuple , он будет ожидать связывания с 2-мя кортежами значений и присвоения имен "line1" и "line2" для этих двух значений.
Выражение - это следующие 4 строки. Внутри этого выражения есть локальные переменные. Их также называют "line1" и "line2", но их легко можно было бы переименовать в "x" и "y" или что-то еще - область действия этих идентификаторов является локальной для этого выражения с отступом. (Тот факт, что одни и те же имена используются в качестве имен во внешней области видимости, не имеет никакого эффекта в том, что касается компилятора.)
Последняя строка, если выражение является «возвращаемым значением» выражения. В этом случае он возвращает два набора значений «line1» и «line2» (или «x» и «y», если вы переименуете их для ясности изложения). Кстати, поскольку каждое из этих двух значений имеет тип «string», тип возвращаемого выражения - «string * string», который представляет собой 2-кортеж, где каждое значение является строкой. Это означает, что исходные имена «line1» и «line2» в первой строке будут выводиться с типом «string».
F # является функциональным, и поэтому в некотором смысле «все является выражением» и «нет выражений» (только последовательности выражений, которые последовательно оцениваются), но вполне нормально, что (ab) использовать термин «выражение» «описать внутренние линии« пусть », если вы не пытаетесь быть очень точными.