2012-03-15 4 views
16

패턴 일치를 지키지 않는다는 것을 알고 있습니다. 즉, 패턴마다 '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 

답변

16

첫 번째 것이 올바른 것입니다. 나는 당신에게 haskell 위키에있는 let vs where 페이지를 보길 권한다. 좋은 책이다. (또한 스코핑을 처리하는 방법도 설명한다.) 메모와 마찬가지로 동일한 정의를 반복해서는 안됩니다. 코드가 다른 방식으로 구조화되어야한다는 신호입니다.

5

where 절의 범위는 전체 수식이므로 첫 번째 예가 작동합니다.