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
%