2012-03-15 3 views
16

Я знаю, что они не выдерживают совпадения шаблонов (т. Е. Вам нужно переписать предложение «где» для каждого шаблона), но как работает обзор для охранников?В Haskell, какова область применения 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 

ответ

16

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

5

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

Смежные вопросы