計算機科学のブログ

Haskell - コンテキストでの型の操作 - Applicative型クラス:関数をコンテキスト内で使用する - レコード構文

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT5(コンテキストでの型の操作)、LESSON 28(Applicative型クラス:関数をコンテキスト内で使用する)、28.5(練習問題)、Q28-3の解答を求めてみる。

コード

sample.hs

import Data.Map qualified as Map

main :: IO ()
main = do
  mapM_ print partsDB
  x <- getLine
  y <- getLine
  let n = read x :: Int
      m = read y :: Int
      p1 = Map.lookup n partsDB
      p2 = Map.lookup m partsDB
      p = min <$> (cost <$> p1) <*> (cost <$> p2)
  print p

data RobotParts = RobotParts
  { name :: String,
    cost :: Double
  }
  deriving (Show)

leftArm :: RobotParts
leftArm =
  RobotParts
    { name = "left arm",
      cost = 1000.00
    }

rightArm :: RobotParts
rightArm =
  RobotParts
    { name = "right arm",
      cost = 1025.00
    }

robotHead :: RobotParts
robotHead =
  RobotParts
    { name = "robot head",
      cost = 5092.25
    }

partsDB :: Map.Map Int RobotParts
partsDB = Map.fromList $ zip [1, 2, 3] [leftArm, rightArm, robotHead]

入出力結果(Terminal, Zsh)

% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
1
2
Just 1000.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
1
3
Just 1000.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
2
1
Just 1000.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
2
3
Just 1025.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
3
1
Just 1000.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
3
2
Just 1025.0
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
1
4
Nothing
% runghc sample.hs
RobotParts {name = "left arm", cost = 1000.0}
RobotParts {name = "right arm", cost = 1025.0}
RobotParts {name = "robot head", cost = 5092.25}
4
5
Nothing
%