В Haskell, какова сфера действия предложения where при работе с охранниками? - PullRequest
16 голосов
/ 15 марта 2012

Я знаю, что они не сохраняются при сопоставлении с образцом (т. Е. Вам нужно переписать условие '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

Ответы [ 2 ]

16 голосов
/ 15 марта 2012

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

5 голосов
/ 15 марта 2012

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

...