計算機科学のブログ

コンテキストでの型の操作 コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる 非決定論的な計算とリスト

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(コンテキストでの型の操作)、LESSON29(コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる)、29.6(練習問題)Q29-3の解答を求めてみる。

コード

必要な購入本数 :: [Int]
必要な購入本数 = pure (-) <*> 必要な本数 <*> 既にある本数

必要な本数 :: [Int]
必要な本数 = (+ ルームメイトと飲んだ本数) <$> 友人と飲んだ本数

既にある本数 :: [Int]
既にある本数 = [6, 12]

ルームメイトと飲んだ本数 :: Int
ルームメイトと飲んだ本数 = 4

友人と飲んだ本数 :: [Int]
友人と飲んだ本数 = pure (*) <*> 総人数 <*> 夜に飲む本数

総人数 :: [Int]
総人数 = pure (+) <*> [2] <*> [2, 3]

夜に飲む本数 :: [Int]
夜に飲む本数 = [3, 4]

main :: IO ()
main = do
  print 必要な購入本数
  print $ maximum 必要な購入本数

入出力結果(Terminal, Zsh)

% runghc sample3.hs
[10,4,14,8,13,7,18,12]
18
%