計算機科学のブログ

コンテキストでの型の操作 Monad型クラス Applicativeよりも強力であることの証明、<*>演算子の汎用版、メソッド、>>=演算子、ラムダ関数、return

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(コンテキストでの型の操作)、LESSON 30(Monad型クラス)、30.5(練習問題)Q30-2の解答を求めてみる。

コード

-- メモ
-- g :: a -> b
-- y :: a
-- f y :: b
-- return (g y) :: m b
allApp :: Monad m => m (a -> b) -> m a -> m b
allApp f x = f >>= (\g -> (x >>= \y -> return (g y)))

halve :: Integer -> Double
halve n = (fromIntegral n) / 2

halveMaybe :: Maybe (Integer -> Double)
halveMaybe = Just halve

x = allApp halveMaybe (Just 2)
y = allApp halveMaybe (Just 3)
z = allApp halveMaybe Nothing

main :: IO ()
main = do
    mapM_ print [x, y, z]

入出力結果(Terminal, Zsh)

% runghc sample2.hs         
Just 1.0
Just 1.5
Nothing
%