2012-11-01から1ヶ月間の記事一覧
制約の緩いConveyorT、GeneratorTのおまけつき。どちらも元はごく単純で、「続きの計算を得るのに値が必要」「続きの計算に値がくっついている」を表している。 import Data.Monoid import Control.Monad.Trans.Free type ConveyorT a = FreeT ((->) a) type…
前回のGotoモナドをさらに強化し、未来にも行けるようにしてみた。 import qualified Data.IntMap as Map import Control.Monad.Trans.Free import Control.Monad.Trans import Control.Monad newtype Ticket = TicketId {getTicketId :: Int} deriving (Eq,…
かなりシンプルに実装できた。よい子は絶対にマネしないでね! import qualified Data.IntMap as M import Control.Monad.Trans.Free import Control.Monad.Trans newtype Label = LabelId Int deriving (Eq, Ord) data Labeling a = Label (Label -> a) | G…
とても簡単。Free(T)に「続きがない」ということを表すFunctorをはめるだけ。 ex1はある文字列を入力すると終了するプログラム。 import Prelude hiding (break) import Control.Monad.Trans.Free import Control.Monad.Trans import Control.Monad data Zer…
Freeモナドはすごい。Haskellを書いていて、「特殊化された処理を記述するモナドが簡単に作れたら便利だろうなー」と思ったことはないだろうか?簡単に作れるのである、そう、Haskellならね。これが、純粋なFreeモナドの定義である。 data Free f a = Pure a…