型によるプログラミング パラメータ化された型 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
%