型の紹介 - カスタム型の作成 - レコード構文を使用する - dataキーワード、データコンストラクタ
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT2(型の紹介)、LESSON 12(カスタム型の作成)、12.3(レコード構文を使用する)、クイックチェック 12-2の解答を求めてみる。
コード
sample2.hs
main :: IO ()
main = do
print $ showPatient janeElizabethSmith
janeElizabethSmith :: Patient
janeElizabethSmith = Patient (NameWithMiddleName "Jane" "Elizabeth" "Smith") Male 30 74 200 (BloodType B Pos)
type FirstName = String
type LastName = String
type MiddleName = String
data Name = Name FirstName LastName |
NameWithMiddleName FirstName MiddleName LastName
showName :: Name -> String
showName (Name f l) = f ++ " " ++ l
showName (NameWithMiddleName f m l) = f ++ " " ++ m ++ " " ++ l
data Sex = Male | Female
showSex :: Sex -> String
showSex Male = "M"
showSex Female = "F"
data RhType = Pos | Neg
data ABOType = A | B | AB | O
data BloodType = BloodType ABOType RhType
showRh :: RhType -> String
showRh Pos = "+"
showRh Neg = "-"
showABO :: ABOType -> String
showABO A = "A"
showABO B = "B"
showABO AB = "AB"
showABO O = "O"
showBlood :: BloodType -> String
showBlood (BloodType abo rh) = showABO abo ++ " " ++ showRh rh
data Patient = Patient Name Sex Int Int Int BloodType
showPatient :: Patient -> String
showPatient (Patient name sex age height weight blood) =
showName name ++ " " ++
showSex sex ++ " " ++
show age ++ " " ++
show height ++ " " ++
show weight ++ " " ++
showBlood blood
入出力結果(Terminal, Zsh)
% runghc sample2.hs
"Jane Elizabeth Smith M 30 74 200 B +"
%