Ответ 1
Охранники описаны в Haskell 2010 раздел 3.13, Case Expressions (в этом разделе речь идет о выражениях case, а не объявлениях верхнего уровня, но предположительно семантика одинакова):
guards → | guard1, …, guardn (n ≥ 1)
guard → pat <- infixexp (pattern guard)
| let decls (local declaration)
| infixexp (boolean guard)
Для каждого защищенного выражения разделители, разделенные запятыми, последовательно проверяются слева направо. Если все они успешны, то соответствующее выражение оценивается в среде, расширенной с привязками, введенными охранниками. То есть привязки, введенные охранником (либо с помощью предложения let, либо с защитой шаблона), находятся в области видимости в следующих защитниках и соответствующем выражении. Если какой-либо из охранников терпит неудачу, то это защищенное выражение терпит неудачу и проверяется следующее охраняемое выражение.
В простом случае запятая выполняет роль, подобную булевой и. Но запятая более мощная в том, что каждый охранник может вводить новые привязки, которые используются последующими охранниками (исходя из слева направо).
Запястья в охранниках довольно необычны (по моему опыту, по крайней мере), что я бы описал эту функцию как мелочь Хаскелла - вовсе не нужно писать (или, по большей части, читать) Haskell. Я подозреваю, что программирование Haskell с первых принципов опустило его по этой причине.