計算機科学のブログ

コンテキストでの型の操作 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
%