Подтвердить что ты не робот

В 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
4b9b3361

Ответ 1

Первый правильный. Я предлагаю вам взглянуть на страницу let vs where на wiki haskell, это хорошее чтение (и в нем также объясняется, как справляться с областью определения области). Как примечание, вы никогда не должны повторять одни и те же определения... это признак того, что ваш код должен быть структурирован по-другому.

Ответ 2

Объем предложения where - это все уравнение, поэтому ваш первый пример работает.