HaskellのDiagramsライブラリ

今日はDiagramsのことを知った。

Diagrams - About diagrams
DiagramsはHaskellで使えるベクターグラフィックス・ライブラリを生成するためのドメイン特化言語ギャラリーを見ると、どんなことができるか少しだけ分かる。

チュートリアルの最初の例。

{-# LANGUAGE NoMonomorphismRestriction #-}

import Diagrams.Prelude
import Diagrams.Backend.Cairo.CmdLine

main = defaultMain (circle 1)

これをコンパイルして、実行する。

$ ghc --make DiagramsTutorial.hs
[1 of 1] Compiling Main             ( DiagramsTutorial.hs, DiagramsTutorial.o )
Linking DiagramsTutorial ...
$ ./DiagramsTutorial -o circle.png -w 200

runghcで実行してもいい。

$ runghc DiagramsTutorial.hs -o circle.png -w 200

最初の例は、単に円が出力される。
f:id:mandel59:20121117222510p:plain

円を塗りつぶす色を指定してみよう。

{-# LANGUAGE NoMonomorphismRestriction #-}

import Diagrams.Prelude
import Diagrams.Backend.Cairo.CmdLine
import Data.Colour.Names

main = defaultMain myDiagram

myDiagram = circle 1 # fc skyblue

f:id:mandel59:20121117230057p:plain

演算子 (#) は、右辺の関数を左辺に適用する。

x # f = f x

だから、上の例は

myDiagram = fc skyblue (circle 1)

と同じ。

skyblueはData.Colour.Namesで定義されている。

今度は図形を重ねる。

myDiagram = square 0.5 # fc yellow `atop` circle 1 # fc skyblue

f:id:mandel59:20121117230141p:plain

`atop`は図形を重ねる。左辺の図形が上にくる。こんな感じで図形に関数を適用していって、目的の図を作ることができる。

雪だるまの顔を描いてみる。

{-# LANGUAGE NoMonomorphismRestriction #-}

import Diagrams.Prelude
import Diagrams.Backend.Cairo.CmdLine
import Data.Colour.Names

main = defaultMain snowman'sFace

snowman'sFace = nose `atop` eyes `atop` mouth `atop` face
eyes = (translateY 0.4) . centerXY $ eye ||| strutX 0.2 ||| eye
eye = circle 0.2 # fc black
face = circle 1 # fc snow
nose = circle 0.2 # fc tomato
mouth = arc (tau * 6 / 10 :: Rad) (tau * 9 / 10 :: Rad) # scale 0.6 # lw 0.1

f:id:mandel59:20121117224729p:plain
(雪だるまの顔に見えるかは少し厳しい)

この前(はてブで)話題になっていたFactorization diagramsもDiagramsで。
Factorization diagrams | The Math Less Traveled

もっと詳しい使い方はチュートリアル(英語)とかユーザーマニュアル(英語)を読むといいよ。