型の紹介 カスタム型の作成 レコード構文、フィールドの値の取り出し、関数
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT2(型の紹介)、LESSON12(カスタム型の作成)、12.5(練習問題)Q12-1の解答を求めてみる。
コード
type FirstName = String
type LastName = String
type MiddleName = String
data Name
= Name FirstName LastName
| NameWithMiddle FirstName MiddleName LastName
data ABOType = A | B | AB | O
data RhType = Pos | Neg
data BloodType = BloodType ABOType RhType
data Patient = Patient
{ name :: Name,
bloodType :: BloodType
}
canDonateToBloodType :: BloodType -> BloodType -> Bool
canDonateToBloodType (BloodType O _) _ = True
canDonateToBloodType _ (BloodType AB _) = True
canDonateToBloodType (BloodType A _) (BloodType A _) = True
canDonateToBloodType (BloodType B _) (BloodType B _) = True
canDonateToBloodType _ _ = False
canDonateTo :: Patient -> Patient -> Bool
canDonateTo p1 p2 =
let b1 = bloodType p1
b2 = bloodType p2
in canDonateToBloodType b1 b2
jackSmith :: Patient
jackSmith =
Patient
{ name = Name "Jackie" "Smith",
bloodType = BloodType O Neg
}
johnDoe :: Patient
johnDoe =
Patient
{ name = Name "John" "doe",
bloodType = BloodType AB Pos
}
main :: IO ()
main = do
print $ canDonateTo jackSmith johnDoe
print $ canDonateTo johnDoe jackSmith
入出力結果(Terminal, Zsh)
% runghc sample1.hs
True
False
%