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)]
%