Я думаю, что здесь полезно понимать нелегкий синтаксис.Давайте переведем:
1-я версия (пусть выражения связывания)
let samplefn() =
let z = 2 in
let z = z * 2 in
printfn "hi";;
samplefn();;
Здесь важно понять, что все привязки пусть не верхнего уровня на самом деле являются выражениями вида let <variable> = <expression1> in <expression2>
где <variable>
связан с результатом <expression1>
в новой области видимости <expression2>
, а <expression2>
- это возвращаемое значение всего выражения.Легкий синтаксис заставляет вас верить, что такие привязки let являются переменными присваиваниями / утверждениями, хотя на самом деле действительно верно, что почти все в F # является выражением.
Возможно, следующее иллюстрирует это более четко:
let a = (let b = 3 in b + 2) //a is 5
2-я версия (привязки let верхнего уровня)
let z = 2;;
let z = z * 2;;
printfn "Error: Duplicate definition of value z";;
Привязки let верхнего уровня завершаются с ;;
, что указывает на завершение того, что можно считать оператором.Верхний уровень - это одна область, и здесь мы получаем ошибку при попытке дважды связать z
в одной и той же области.Принимая во внимание, что используя форму выражения привязок let в Примере 1, мы связываем z
заново для каждой подобласти в цепочке выражений.Обратите внимание, что мы можем сделать что-то вроде этого на верхнем уровне:
let z = (let z = 2 in z * 2);;