コンテキストでの型の操作 コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる 非決定論的な計算、pure関数、<*>演算子
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(コンテキストでの型の操作)、LESSON 29(コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる)、29.5(練習問題)Q29-3の解答を求めてみる。
コード
pack :: [Int]
pack = [6, 12]
roommates :: [Int]
roommates = [2]
yesterday :: [Int]
yesterday = [2]
friends :: [Int]
friends = [2, 3]
game :: [Int]
game = [3, 4]
beer :: [Int]
beer = pure (-) <*> pack <*>
(pure (+) <*>
(pure (*) <*> roommates <*> yesterday) <*>
(pure (*) <*>
(pure (+) <*> roommates <*> friends) <*>
game))
need :: Int
need = - (foldr min 0 beer)
main :: IO ()
main = do
print beer
putStrLn (mconcat ["購入する必要がある十分な量のビールは", show need, "本"])
入出力結果(Terminal, Zsh)
% runghc sample3.hs
[-10,-14,-13,-18,-4,-8,-7,-12]
購入する必要がある十分な量のビールは18本
%