HaskellForMathsパッケージを使ってみる

  • こちらに"Haskell for Maths"なるブログがあって、"HaskellForMaths"なるパッケージをHackageに置いている人がいる
  • きっと、Haskellの数学親和性に興味があって書いたり作ったりしている人だろうから、このパッケージを使うことを目的にHaskellの練習をしてみよう
  • cabalを入れる。cabalはHaskellアプリ・Haskellパッケージを使うためにHackageにアクセスしたりするソフト
  • 最新版にして
$ cabal update
  • 目的のパッケージをインストール
$ cabal install HaskellForMaths
  • こんなターミナル
MacBookProLate2013:~ ryamada$ cabal install HaskellForMaths
Resolving dependencies...
Downloading HaskellForMaths-0.4.5...
Configuring HaskellForMaths-0.4.5...
Building HaskellForMaths-0.4.5...
Installed HaskellForMaths-0.4.5
Updating documentation index
/Users/ryamada/Library/Haskell/share/doc/index.html
MacBookProLate2013:~ ryamada$ 
  • "/Users/ryamada/Library/Haskell/share/doc/index.html"というドキュメントに連携されたみたいなので、それをブラウザで開いてみる

  • 確かにあります
  • さて、まずはGHCiでやってみましょう
  • このブログ記事をやってみます
    • ファイルを:loadしているけれど、GHCiではimport
import Math.Combinatorics.Graph
q 3
  • とやれば
Prelude> import Math.Combinatorics.Graph
Prelude Math.Combinatorics.Graph> q 3
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package containers-0.5.5.1 ... linking ... done.
Loading package old-locale-1.0.0.6 ... linking ... done.
Loading package time-1.4.2 ... linking ... done.
Loading package random-1.0.1.1 ... linking ... done.
Loading package HaskellForMaths-0.4.5 ... linking ... done.
G [0,1,2,3,4,5,6,7] [[0,1],[0,2],[0,4],[1,3],[1,5],[2,3],[2,6],[3,7],[4,5],[4,6],[5,7],[6,7]]
Prelude Math.Combinatorics.Graph> 
  • となって、めでたしめでたし
  • ブログ記事には「グラフの絵」があるのでわかりやすいけれど、ここでは何のことやらわからないけれど、Math.Combinatorics.Graphのqの定義を先のhtml documentで確認すれば、以下のようになっていて、Int タイプの引数を取って、Graph tを返すものとわかる。ただし、tはIntegral。そしてこれだけではわからないのが、Graph。
q :: Integral t => Int -> Graph t

q k is the graph of the k-cube
  • でもドキュメントはクリッカブルなのでクリックして飛べば、以下のように書いてある
data Graph a

Datatype for graphs, represented as a list of vertices and a list of edges. For most purposes, graphs are required to be in normal form. A graph G vs es is in normal form if (i) vs is in ascending order without duplicates, (ii) es is in ascending order without duplicates, (iii) each e in es is a 2-element list [x,y], x<y

Constructors
G [a] [[a]]	 
Instances
Functor Graph	 
Eq a => Eq (Graph a)	 
Ord a => Ord (Graph a)	 
Show a => Show (Graph a)	 
  • モジュールの記述自体が見たいとなると、ちょっと面倒だけれど、leksahを使うと見られます!