ナイーブに実装してみるisBigGang :: Int-> BoolisBigGang x = x > 9isBigGang :: Int -> (Bool, String)isBigGang x =(x > 9, "Compared gang size to 9")Thursday, August 22, 13
5.
すでに文字列(文脈)のくっついた値を処理するには?applyLog :: (a,String) ->(a -> (b, String)) -> (b, String)applyLog (x, log) f =let (y, newLog) = f x in(y, log ++ newLog)>>= と似た感じ(>>=) :: m a -> (a -> m b) -> m bThursday, August 22, 13
6.
applyLogを使ってみる•ログが連結される•関数は文脈なしの値を引数にとる> (3, "abc")`applyLog` isBigGang(False, "abcCompared gang size to 9")> ("Tobin", "Got outlaw name.") `applyLog`(x -> (length x, "Applied length.")(5, "Got out lawname. Applied length.")Thursday, August 22, 13
モノイドを使って書き換えてみるapplyLog :: (Monoidm) =>(a,m)->(a->(b,m))->(b,m)applyLog (x, log) f =let (y, newLog) = f x in(y, log `mappend` newLog)「値+ログ」から「値+モノイド値」に拡張されたThursday, August 22, 13
9.
食べ物を与えると飲み物+値段が返る関数import Data.Monoidtype Food= Stringtype Price = Sum IntaddDrink :: Food -> (Food, Price)addDrink "beans" = ("milk", Sum 25)addDrink "jerky" = ("whiskey", Sum 99)addDrink _ = ("beer", Sum 30)モノイドは値に計算が定義されているのがいいねThursday, August 22, 13
10.
「食べ物+値段」にaddDrinkを適用すると..> ("beans", Sum10) `applyLog` addDrink("milk,Sum {getSum=35})> ("dogmeat", Sum 5) `applyLog` addDrink("beer",Sum {getSum=35})> ("dogmeat", Sum 5) `applyLog` addDrink`applyLog` addDrink("beer",Sum {getSum=65})おまけの値はログに限らないことがはっきりしたThursday, August 22, 13