計算機科学のブログ

型によるプログラミング パラメータ化された型 Data.Mapモジュール、Map型、fromList関数、toList関数、lookup関数、key、順序

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

コード

import Data.Map as Map

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

organs :: [Organ]
organs = [Heart, Heart, Brain, Spleen, Spleen, Kidney]

ids :: [Int]
ids = [2, 7, 13, 14, 21, 24]

organPairs :: [(Int, Organ)]
organPairs = zip ids organs

organCatalog :: Map Int Organ
organCatalog = Map.fromList organPairs

organCatalogValues :: [Organ]
organCatalogValues = Prelude.map snd (Map.toList organCatalog)

organCounts :: [(Organ, Int)]
organCounts =
  Prelude.map
    ( \organ ->
        ( organ,
          length $ Prelude.filter (== organ) organCatalogValues
        )
    )
    [Heart .. Spleen]

organCountsMap = Map.fromList organCounts

main = do
  print organs
  mapM_
    ( \organ ->
        putStrLn $
          mconcat
            [ show organ,
              " ",
              show $
                Map.lookup
                  organ
                  organCountsMap
            ]
    )
    [Heart .. Spleen]

入出力結果(Terminal, Zsh)

% runghc sample2.hs
[Heart,Heart,Brain,Spleen,Spleen,Kidney]
Heart Just 2
Brain Just 1
Kidney Just 1
Spleen Just 2
%