計算機科学のブログ

型の紹介 - カスタム型の作成 - レコード構文を使用する - 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 +"
%