Прежде всего, почему обнимает? Haskell Platform - это обычно рекомендуемый способ для новичков, который поставляется с GHC.
Теперь перейдем к ключевому слову let
.Простейшая форма этого ключевого слова означает, что всегда может использоваться с in
.
let {assignments} in {expression}
Например,
let two = 2; three = 3 in two * three
{assignments}
являются только в области действия в соответствующем {expression}
. Применяются обычные правила компоновки, означающие, что in
должен иметь отступ по крайней мере столько же, сколько let
, которому он соответствует, и любойподвыражения, относящиеся к выражению let
, также должны иметь отступ по крайней мере столько же.На самом деле это не на 100% верно, но это хорошее правило;Правила компоновки Haskell - это то, к чему вы привыкнете со временем, когда будете читать и писать код на Haskell.Просто помните, что количество отступов - это основной способ указать, какой код относится к какому выражению.
Haskell предоставляет два удобных случая, когда вам не нужно писать in
: делать обозначения и составлять списки (на самом деле, понимания монад).Область назначений для этих удобных случаев предопределена.
do foo
let {assignments}
bar
baz
Для обозначения do
, {assignments}
находятся в области действия для любых операторов, которые следуют, в данном случае, bar
и baz
, но не foo
.Это похоже на то, как если бы мы написали
do foo
let {assignments}
in do bar
baz
Список понятий (или, на самом деле, любое понимание монады) в десагарской нотации, поэтому они предоставляют аналогичные возможности.
[ baz | foo, let {assignments}, bar ]
{assignments}
находятся в области видимости для выражений bar
и baz
, но не для foo
.
where
несколько отличается.Если я не ошибаюсь, область действия where
совпадает с определением определенной функции.Поэтому
someFunc x y | guard1 = blah1
| guard2 = blah2
where {assignments}
{assignments}
в этом предложении where
имеют доступ к x
и y
.guard1
, guard2
, blah1
и blah2
все имеют доступ к {assignments}
этого предложения where
.Как упомянуто в уроке, который вы связали, это может быть полезно, если несколько охранников используют одни и те же выражения.