計算機科学のブログ

型の紹介 カスタム型の作成 レコード構文を使用する

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT2(型の紹介)、LESSON 12(カスタム型の作成)、12.3(レコード構文を使用する)のクイックチェック12-2、クイックチェック 12-3の解答を求めてみる。

コード

-- クイックチェック 12-2
type FirstName = String 
type LastName = String 
type MiddleName = String 

data Sex = Male | Female
data ABOType = A | B | AB | O
data RhType = Pos | Neg
data BloodType = BloodType ABOType RhType
data Name = Name FirstName LastName 
    | NameWithMiddle FirstName MiddleName LastName
data Patient = Patient Name Sex Int Int Int BloodType

janeElizabethSmith :: Patient
janeElizabethSmith =
    Patient (NameWithMiddle "Jane" "Elizabeth" "Smith")
            Female
            20
            70
            100
            (BloodType O Neg)

printName :: Name -> [Char]
printName (Name fname lname) = fname ++ " " ++ lname
printName (NameWithMiddle fname mnamd lname) =
    fname ++ " " ++ mnamd ++ " " ++ lname

printPatient :: Patient -> [Char]
printPatient (Patient name _ _ _ _ _) = printName name

-- クイックチェック 12-3
data Patient1 = Patient1 { name :: Name
                         , sex::Sex
                         , age :: Int
                         , height :: Int
                         , weight :: Int
                         , bloodType :: BloodType}

jackieSmith :: Patient1
jackieSmith = Patient1 {name = Name "Jackie" "Smith"
                      , age = 43
                      , sex = Female
                      , height = 62
                      , weight = 115
                      , bloodType = BloodType O Neg}

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /.../.ghc/ghci.conf
Prelude
λ> :load sample02
[1 of 1] Compiling Main             ( sample02.hs, interpreted )
Ok, one module loaded.
(0.01 secs,)
*Main
λ> :load sample02
[1 of 1] Compiling Main             ( sample02.hs, interpreted )
Ok, one module loaded.
(0.01 secs,)
*Main
λ> printPatient janeElizabethSmith 
"Jane Elizabeth Smith"
it :: [Char]
(0.00 secs, 81,792 bytes)
*Main
λ> :load sample02
[1 of 1] Compiling Main             ( sample02.hs, interpreted )
Ok, one module loaded.
(0.01 secs,)
*Main
λ> printName (name jackieSmith)
"Jackie Smith"
it :: [Char]
(0.00 secs, 71,280 bytes)
*Main
λ> :quit
Leaving GHCi.
%