コンテキストでの型の操作 Applicative型クラス:関数をコンテキスト内で使用する コンテキストでの部分適用に<*>を使用する
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(コンテキストでの型の操作)、LESSON28(Applicative型クラス:関数をコンテキスト内で使用する)、28.2(コンテキストでの部分適用に<*>を使用する)、クイックチェック 28-3の解答を求めてみる。
コード
maybeMul :: (Applicative f, Integral b) => f b -> f b -> f b
maybeMul n m = (*) <$> n <*> m
maybeDiv :: (Applicative f, Integral b) => f b -> f b -> f b
maybeDiv n m = div <$> n <*> m
maybeMod :: (Applicative f, Integral b) => f b -> f b -> f b
maybeMod n m = mod <$> n <*> m
ns :: [Maybe Integer]
ns = map Just [-2, 1, 3, 4, 5] ++ [Nothing]
fs = [maybeMul, maybeDiv, maybeMod]
main :: IO ()
main = do
mapM_
( \n ->
mapM_
( \m ->
mapM_
(\f -> print $ f n m)
fs
)
ns
)
ns
入出力結果(Terminal, Zsh)
% runghc sample02.hs
207.19139481857147
215.50763229827754
1202.5371978964183
0.0
%