いくつかのタイプがありますRecord
:
type Day = Integer
type Description = String
type Name = String
type PhoneNumber = String
type Year = Integer
data Month = January | February | March | April | May | June | July
| August | September | October | November | December
deriving (Eq, Ord, Enum, Show)
data Birthday = Birthday Month Day
deriving (Eq, Show)
data DatingDate = DatingDate Year Month Day
deriving (Eq, Show)
data Record = BirthdayRecord Name Birthday
| PhoneRecord Name PhoneNumber
| DatingRecord DatingDate Description
deriving (Eq, Show)
そして、これらのレコードを日付でフィルタリングする関数:
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'
year
実は、パターンが一致する部分getAssignment
とyear
パターンが一致する部分がmatchDate
同じではないのは、私にとってはちょっと驚きです。
year
では、変数のスコープ境界はどこで開始および終了しますか?それはセクションのために起こりwhere
ますか?
(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
どうすれば書き直すことができますか?