まず、いくつかのタイプミス:
data Course = Course {
id :: Int,
title :: String
} deriving (Eq, Show)
データコンストラクター名(「Course」)の追加と「derives」から「deriving」への変更に注意してください。
data Req = Single Course
| Any [Req]
| All [Req]
deriving Show
こっちも一緒。
satisfies :: [Course] -> Req -> Bool
タイプを[コース]から[コース]に変更しました。
course1 = Course 1 "One"
course2 = Course 2 "Two"
course3 = Course 3 "Three"
course4 = Course 4 "Four"
course5 = Course 5 "Five"
req1 = Single course2
req2 = Any [Single course2, Single course3, Single course5]
req3 = All [Single course1, Single course2]
req4 = Any [req2, req3]
req5 = All [req4, req1]
いくつかのテストデータ。
satisfies cs (Single c) = c `elem` cs
シングルコースの要件に一致します。他の2つは、そのシンプルさが美しいです。彼らが行うことのほとんどは、プレリュードですでに定義されており、英語のように読むことができます。
satisfies cs (Single c) = c `elem` cs
satisfies cs (Any reqs) = any (satisfies cs) reqs
satisfies cs (All reqs) = all (satisfies cs) reqs
これがあなたの友達の型署名ですany
そしてall
:
any :: (a -> Bool) -> [a] -> Bool
all :: (a -> Bool) -> [a] -> Bool
どちらもブール関数を取り、リストの各メンバーに対してテストします。要件のリストと、テスト機能(satisfies
再帰的に使用され、部分的に免除されたコースに適用されたもの)があるので、それらを直接使用できます。
テストしてみましょう:
*TestSO15213421> satisfies [course1] req1
False
*TestSO15213421> satisfies [course2] req1
True
*TestSO15213421> satisfies [course1, course2] req1
True
*TestSO15213421> satisfies [course1, course2] req1
True
*TestSO15213421> satisfies [course1, course2] req3
True
*TestSO15213421> satisfies [course1, course3] req3
False
*TestSO15213421> satisfies [course1, course3] req2
True
*TestSO15213421> satisfies [course4] req2
False
*TestSO15213421> satisfies [course4] req5
False
*TestSO15213421> satisfies [course5] req2
True
*TestSO15213421> satisfies [course4] req4
False
*TestSO15213421> satisfies [course2] req4
True
*TestSO15213421> satisfies [course2, course3] req4
True
*TestSO15213421> satisfies [course5, course3] req4
True
*TestSO15213421> satisfies [course5, course3] req5
False
すべて期待通り。