計算機科学のブログ

Haskell - 型によるプログラミング - パラメータ化された型 - マップ、キー、Ordクラス

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT3(型によるプログラミング)、LESSON 18(パラメータ化された型)、18.14(練習問題)、Q18-2の解答を求めてみる。

コード

sample.hs

import Data.Map qualified as Map

main :: IO ()
main = do
  print organCatalog
  print organInventory

data Organ = Heart | Brain | Kidney | Spleen deriving (Show, Eq, Ord, Enum)

organCatalog :: Map.Map Int Organ
organCatalog =
  let organs :: [Organ]
      organs = [Heart, Heart, Brain, Spleen, Spleen, Kidney]
      ids :: [Int]
      ids = [2, 7, 3, 14, 21, 24]
      organPairs :: [(Int, Organ)]
      organPairs = zip ids organs
   in Map.fromList organPairs

organInventory :: Map.Map Organ Int
organInventory =
  let allOrgans = [Heart .. Spleen]
      organs = map snd $ Map.toList organCatalog
   in Map.fromList $ zip allOrgans $ map (\organ -> length $ filter (== organ) organs) allOrgans

入出力結果(Terminal, Zsh)

% runghc sample.hs 
fromList [(2,Heart),(3,Brain),(7,Heart),(14,Spleen),(21,Spleen),(24,Kidney)]
fromList [(Heart,2),(Brain,1),(Kidney,1),(Spleen,2)]
%