計算機科学のブログ

型の紹介 カスタム型の作成 レコード構文、フィールドの値の取り出し、関数

入門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
%