В Haskell, каков объем предложения where при работе с охранниками?
Я знаю, что они не выдерживают совпадения шаблонов (т.е. вам нужно переписать предложение "where" для каждого шаблона), но как работает надпись для охранников?
например. Это работает?
myFunction x1 x2
| x1 > x2 = addOne x1
| x1 < x2 = addOne x2
| otherwise = x1
where addOne = (1+)
Или это должно быть?
myFunction x1 x2
| x1 > x2 = addOne x1
where addOne = (1+)
| x1 < x2 = addOne x2
where addOne = (1+)
| otherwise = x1
Ответы
Ответ 1
Первый правильный. Я предлагаю вам взглянуть на страницу let vs where на wiki haskell, это хорошее чтение (и в нем также объясняется, как справляться с областью определения области).
Как примечание, вы никогда не должны повторять одни и те же определения... это признак того, что ваш код должен быть структурирован по-другому.
Ответ 2
Объем предложения where
- это все уравнение, поэтому ваш первый пример работает.