2012-01-01から1年間の記事一覧

Freeモナド実用の旅(5): MonadPlus for Free

Control.MonadPlus.Freeはいなくなりました えにっきをみてください freeの新バージョンにControl.MonadPlus.Freeなるものがあったのでさっそく使ってみた。MonadPlus版Freeのコンストラクタは、Pure、Freeに加えて新たにPlusが加わっており、任意のFunctor…

Toxic Biohazardを買った

何だと思う?…これね、減算式FMシンセ。ダークで重厚な音が出せるシンセを探していたところ、Image-LineのToxic Biohazardに出会った。名前も見た目も、一見するとシンセサイザーではないように思えるが、これはれっきとした生物兵器<トキシックシンセサイ…

HaskellのFFIでVSTを作る [Haskell Advent Calendar 2012 14日目]

久等了!記事を投稿しようとしたのだが、膝にunsafeInterleaveIOを受けてしまってな…今回は、HaskellによってVSTを作る方法を紹介したいと思います。 VSTとは VST(Virtual Studio Technology)は、Steinbergによって定められた、ホストアプリケーション(DAW)…

Freeモナド実用の旅(4): FreeなReader、Writerモナド

制約の緩いConveyorT、GeneratorTのおまけつき。どちらも元はごく単純で、「続きの計算を得るのに値が必要」「続きの計算に値がくっついている」を表している。 import Data.Monoid import Control.Monad.Trans.Free type ConveyorT a = FreeT ((->) a) type…

Freeモナド実用の旅(3): TimeMachineモナド

前回の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,…

Freeモナド実用の旅(2): Gotoモナド

かなりシンプルに実装できた。よい子は絶対にマネしないでね! 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モナド実用の旅(1): ループからのBreak

とても簡単。Free(T)に「続きがない」ということを表すFunctorをはめるだけ。 ex1はある文字列を入力すると終了するプログラム。 import Prelude hiding (break) import Control.Monad.Trans.Free import Control.Monad.Trans import Control.Monad data Zer…

そろそろFreeモナドに関して一言いっとくか

Freeモナドはすごい。Haskellを書いていて、「特殊化された処理を記述するモナドが簡単に作れたら便利だろうなー」と思ったことはないだろうか?簡単に作れるのである、そう、Haskellならね。これが、純粋なFreeモナドの定義である。 data Free f a = Pure a…

Lazy Kのクワインを約半分に短縮

http://d.hatena.ne.jp/fumiexcel/20120402 のクワインを46085bytesから25677bytesに短縮した。こっちが古いコード。 (lazy-def '(++ self xs ys) '(s (null? xs) (o (cons (car xs)) (self (cdr xs))) ys)) (lazy-def 'syms '(cons 115 (cons 96 (cons 107 …

文字列リテラルが無いLazy Kで黒魔術も力技も使わずにクワイン

Lazy Kで素直にクワインを作ったときのメモ。 Lazy Kとは Lazy Kは、あのHaskellと同じ純粋(Pure)関数型(Functional)言語である。`fxで、xにfを適用する。 関数はi、k、sの3つ。 `ix=x ``kxy=x ```sxyz=``xz`yz 入出力は、0~255までのチャーチ数のリストで表…