범위

2012-04-07 5 views
1

어떤 종류의 Record있다범위

getAssignment :: (Year, Month, Day) -> [Record] -> [Record] 
getAssignment (year, month, day) = filter matchDate 
    where matchDate (BirthdayRecord _ (Birthday month day)) = True 
     matchDate (DatingRecord (DatingDate year month day) _) = True 
     matchDate _ = False 

getAssignment의이 정의는 오류로 인해 올바르지 않습니다 :

warning: Defined but not used: `year' 

실제로 놀랍지 만, 01 패턴 일치 부분이 getAssignment 인 경우이고 matchDate 인 경우 패턴 일치 부분이 year이 아닙니다.

따라서 범위 범위는 year입니다. 변수가 시작되고 끝났습니까? where 섹션 때문에 발생합니까?

btw이 오류는 (year, month, day) 개의 변수를 사용하여 여러 번 사용하면 피할 수 있습니다.

getAssignment' :: (Year, Month, Day) -> [Record] -> [Record] 
getAssignment' date = filter (matchDate date) 
    where matchDate (_, m, d) (BirthdayRecord _ (Birthday month day)) = 
      month == m && day == d 
     matchDate (y, m, d) (DatingRecord (DatingDate year month day) _) = 
      year == y && month == m && day == d 
     matchDate _ _ = False 

어떻게 다시 쓸 수 있습니까?

답변

4

범위는 패턴의 변수가 항상 새로운 변수 바인딩을 정의한다는 것을 제외하고는 전체 표현식 (where 절의 정의 포함)입니다.

동일한 이름을 다시 사용하는 대신 내부 바인딩에 다른 변수 이름을 사용해야합니다. 그 외 범위로부터 변수를 숨기도록 변수 이름 재사용

getAssignment :: (Year, Month, Day) -> [Record] -> [Record] 
getAssignment (year, month, day) = filter matchDate 
    where matchDate (BirthdayRecord _ (Birthday month' day')) 
      = month == month' && day == day' 
     matchDate (DatingRecord (DatingDate year' month' day') _) 
      = year == year' && month == month' && day == day' 
     matchDate _ = False 

는 섀도우 불린다. GHC는 -Wall (또는이 경고 만 활성화하려면 -fwarn-name-shadowing)을 사용하는 경우이를 수행 할 때 경고해야합니다.

편집 : 특정 함수의이 그것을 쓸 수있는 명확한 방법 아마도 :

getAssignment :: (Year, Month, Day) -> [Record] -> [Record] 
getAssignment (year, month, day) = filter matchDate 
    where matchDate (BirthdayRecord _ birthday) = birthday == Birthday month day 
     matchDate (DatingRecord date _)  = date == DatingDate year month day 
     matchDate _       = False 

그러나 당신이 그것을 사용하려는 경우 당신은 패턴의 부분에 이름을 부여 피할 수 없다 , 심지어 다른 것과 비교할지라도.

+0

'달'및 '달'변수를 억제하는 방법이 있습니까? –

+0

죄송합니다. 독자 분의 의견을 이해할 수 없습니다. 당신이 원하는 것에 대해 더 자세히 설명해 주시겠습니까? – dave4420

+0

'f x = x == y' 정의를 보았을 때'x' 변수를 중복 사용하기 때문에'f y == True'처럼 다시 쓰려고합니다. 이 경우 나는 'year', 'month'및 'day'변수를 없애기 위해 동일한 트릭을 사용하고자합니다. –

0

패턴 매칭은 다음과 같은 형식을 취합니다. 생성자 바인딩 1 바인딩 2 ... 여기서 바인딩은 사용을위한 값의 일부를 명명 할 수 있습니다. 그것은 왼편의 수치를 산술 할 때 할 수있는 모든 것입니다. 첫 번째 예제에서는 바인딩에 바인딩 된 이름을 가져 와서 일치를 제한하려는 것처럼 보이지만 그렇게하면 작동하지 않습니다. 경비원이 원하는 것을 찾으십시오.