計算機科学のブログ

コンテキストでの型の操作 コンテキストとしてのリスト: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本
%