継続渡しなHaskellライフ

CPS(Continuation passing style, 継続渡しスタイル)は、関数型プログラミングにおけるプログラムの書き方の一つである。CPSを導入する簡単な例をいくつか紹介しよう。 まず、入力された数値が3の倍数かどうかを判定するプログラムを作ってみよう。 foo :: I…

Lensを使うぜ!

パッケージをインストールするぜ!そしてさっそくghciを起動するぜ! $ cabal install lens $ ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linkin…

Haskell Advent Calendar 13日目: シンセサイザーで理解するArrowプログラミング

Haskell Advent Calendar 13日目の記事です。 ごきげんよう。 今年も音楽の冬がやってまいりました。Haskellより音楽のほうに力を注いでいる気がするこの頃ですが、ふとこう思いました――「Haskellでシンセサイザーを作たらとても楽しいのではないか?」 シン…

Operationalモナドをゲームに応用した話

データを処理することは、プログラミングのもっとも本質的な部分である。数値、文字列、あるいはデータの集まりなどを扱うために、数々の構造が考えられてきた。Haskellにおいては、「手順」もデータとして扱うことができる。これは、DSLを作るうえで非常に…

ミックスの仕上がりを綺麗にする(かもしれない)簡単な工夫

ミキシングはコンピュータによる楽曲制作には欠かせない。きちんとミキシングしなければ、まるで重油の浮いた泥のようなサウンドになってしまうのはご存じだろう。 ミックスにおける重要な課題の一つは、低域をすっきりさせることだ。低域をクリーンにするこ…

高専プロコン競技部門に参加した

どうも、Haskellの宣伝をしまくっていた@fumievalです。 全国高等専門学校 第24回プログラミングコンテスト競技部門に、@NKMR_YA、@39moguraさんと一緒に茨城工業高等専門学校の代表チームとして出場しました。 去年もそれを使った、ような… 競技の流れは以…

「茨城」の読みは「いばらぎ」ではない

いばらき、と読め

型からHello world

Restricted Wordsに参加した。 "Hello World"という文字列を出力するプログラムを、文字・文字列・数値リテラルを使わずに書くという問題。で、回答のコードがこちら。 import Data.Reflection -- cabal install reflection main = putStrLn $ map toEnum [ …

Lazy K 基礎文法最速マスター

Unlambda記法 適用 `FG F、Gは任意の式。 コンビネータ計算記法 適用 (FG) F、Gは任意の式。 Iota記法 適用 *FG F、Gは任意の式。 Jot記法 空白のコード → 恒等関数 X0 → X S K X1 → S (K X) Xは任意の式で、S、Kはコンビネータ。

モナドとはモナドである

この記事を読む前に、絶対に理解出来ないモナドチュートリアルに一度目を通してみてほしい。モナドを理解していく上で、とても重要なことが書かれている。 改めて言おう、モナドはモナドだ。コンテナだとかプログラマブルセミコロンだという説明では、モナド…

モナドの六つの系統[Functor x Functor]

モナドは「アクション」を表す抽象的な構造である。モナドは、Haskellにさまざまな概念に対する記述能力をもたらす。 モナドの基礎 return :: a -> m a: 純粋な値をモナドで包む。 m >>= f :: m a -> (a -> m b) -> m b: モナドmに包まれた値をfに渡し、その…

Freeモナドを超えた!?operationalモナドを使ってみよう

限定版IOみたいなモナドを簡単に作れたら、コードが分離できるしテストもしやすくなるのになあ… 数か月前なら、 それ、Freeモナド*1でできるよ! と返されるだろう。だが今は違う。Freeモナドよりも簡単にモナドを作れるモナド、Operationalモナドがあるのだ…

Indexed Monadの世界

もっと、モナドの力を引き出したくはないか? え?アクションの前後で型を変えたい?いやいやいや、モナドは自己関手の圏上の単なるモノイドだよ、そんなことができ…る…!?えっ、できるの…マジで…? できる。そう、Haskellならね。 {-# LANGUAGE QuasiQuote…

8つの質問で、Lazy K業界の現状を知る

Lazy系の会社の隆盛があって、仕様が定められたのが8年ぐらい前だろうか。 コンビネータ産業の人材動向が、今どうなってるかって? 大方の予想より凄惨ですよ。 それが分かる方法がある。Lazy K技術者に技術力を問う8つの質問によってだ。 Lazy K業界のエン…

Freeモナドでゲームを作ろう!第3回: Haskellは手続き型言語

※最新のfree-gameを想定しているので、古いバージョンを使っている方は今すぐアップグレード(cabal update && cabal install free-game)してください。 7週間以上開きましたが、第3回です。ここからはどんどんプログラムを組み上げていきます。 コードが長く…

モナド変換子の速さを測ってみる

mtl(実装はtransformers)で提供されているモナド変換子のLazy版とStrict版で、どのくらいパフォーマンスの差が出るか調べてみた。また、私がCPS(継続渡しスタイル)で実装したものとも比較してみた。 比較方法 {-# LANGUAGE FlexibleContexts #-} import Cont…

ヘッズのための純粋関数型言語「Lazy SLYR」

ドーモ、変数スレイヤーです。 Brainf*ckめいた派生言語が作られる前に、ニンジャスレイヤーを基にしたニンジャヘッズのための言語「Lazy SLYR」を作ってみた。 ◆Brainfuck派生ではない◆ ◆Lazy K派生でもない◆ ◆独自性重点◆ ◆純粋な◆ Hello, world! イヤーッ…

Freeモナドを使っている方、あるいはこれから使う方へ

FreeモナドのベースとなるFunctorは、GHCのDeriveFunctor拡張を使って、対象のデータ型にderiving Functorをつけることで 自 動 生 成 できます。 例 {-# LANGUAGE DeriveFunctor #-} import Control.Monad.Free data CharIOBase a = GetCh (Char -> a) | Pu…

Freeモナドでゲームを作ろう!第2回: 本当に動かす

連載目次 第0回: 概要 第1回: Gameモナドの基本 Haskellの力を最大限に引き出す 前回紹介したような関数の組み合わせでももちろんゲームは作れるのですが、今回は、さらにゲームを開発しやすくするための手法をいくつか紹介し、その例を実際に動かしてみます…

Freeモナドでゲームを作ろう!第1回: Gameモナドの基本

連載目次 第0回: 概要 第1回: Gameモナドの基本 (この記事) free-gameを使う さて、みなさん、free-gameはインストールしましたか?まだの型方も、もうインストールした方も、本日free-gameを更新したのでcabal update && cabal install free-gameしましょう…

Freeモナドでゲームを作ろう!第0回: 概要

連載目次 第0回: 概要 (この記事) 第1回: Gameモナドの基本 先ほど、free-gameというライブラリをアップロードしました。free-gameは、世界で一番柔軟かつ簡単にゲームなどのGUIを作れるライブラリを目指しています。 Freeモナドとは Freeモナドは、Functor…

究極のモナド「Idealモナド」を垣間見る(続/その0)

前回の記事究極のモナド「Idealモナド」を垣間見るではFreeモナドを構成して興奮して終わってしまったが、今回はイデアルモナドの仕組みについてもう少し考えてみる。 data Ideal f a = Pure a | Ideal (f a) Idealモナドは、純粋な値Pure aか、fというなに…

究極のモナド「Idealモナド」を垣間見る

新年おめでとうございます。 突然だが、中身への関数適用(fmap)、シングルトンの生成(return)、ネストの結合(join)ができるコンテナを一般化するとモナドになる。 昨年話題になったのでご存知の方も多いと思うが、モナドをシングルトンの生成とネストの結合…

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…