プログラミングHaskellなどを読んで、小さなコードは頭では分かるようになったのですが、大きなコードを読んだり自分で設計する際に、どのように関数の適用や合成などをイメージしたり図として表したらいいか分からず悩んでおります。
具体的には、f(x,y,z) = z*(x+y) という関数が表現したい場合、
sample.hs
(*) :: Num a => a->a->a
(+) :: Num a => a->a->a
f1 x y z = z * (x + y)
f2 x y = (*) $ (+) x y
f3 x = (*) . (+) x
のf1〜f3ような関数の書き方があると思います。また、次のような書き方は意図しない結果になっているのですが、
sample.h
g1 = (*) (+)
-- :: (Num a, Num (a -> a -> a)) => (a -> a -> a) -> a -> a -> a
g2 x = (*) $ (+) x
-- :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
g3 = (*) . (+)
-- No instance for (Num (a0 -> a0))
-- arising from a use of `*'
これらの違いを考えるために、関数を何かイメージしたいと思っています。もちろん、型の情報や式を追えば明らかなのですが、もしイメージで理解できればわかりやすくなるのかなと勝手ながら期待しています。
そこで、普段みなさんはどのようにイメージしているのか、もし良いイメージの仕方や表記方法があれば教えてください。それは慣れの問題で、本物のHaskellerにはイメージなんか必要ないというのであればそれでも構いません。(慣れるようがんばります)
参考文献は論文でも英語でも構いません。できれば、無料でアクセスできる方が助かります。








Visual Haskell: A First Attempt
この Visual Haskell というHaskellコードの可視化の試みが求めていたものに近いのですが、これが欲しかったかというとちょっと詳細すぎる感じがするので、これを参考にもうちょっと考えたり探してみたりします。
そのほか、調べて見つけたものを簡単に列挙します。
型クラス
Haskell Class Hierarchy Diagram - Saeed s Simple Blog - Site Home - MSDN Blogs
型クラスの依存関係
bucephalus.org: Haskell number system in one picture
もう少し具体的なクラス図的なもの
Typeclassopedia - HaskellWiki
モナド周辺の型クラスの依存関係
モナド, fmap, lift
Haskell/圏論 - wikibooks
圏を集合として、射(関数)を矢印として表す。圏論を使った抽象的なバックグラウンドな構造を表記する感じ。
モナドとモナド変換子のイメージを描いてみた - melpon日記 - HaskellもC++もまともに扱えないへたれのページ
モナドや持ち上げのイメージ
Automatic Model Generation, part 1: Parallel - Communicating Haskell Processes
モナドを用いた並行処理・メッセージパッシング通信(たぶん)のアーキテクチャの解説の図。詳しく読めてないけど、λで引数を表したり、モナドをつなげたり、Read/Writeを形で表しているのが特徴的。
その他
SourceGraphによるHaskellプログラムの可視化:Graphviz
自動生成による図ということは一般的な表記方法?
Conception of a Graphical Interface for Querying XML : Related work
XMLクエリーの可視化についての学位論文、各種のアルゴリズムやデータ構造の可視化がまとまってる。ここに Visual Haskell のリファレンスがあった。
他にも、何かいい方法がありましたら教えてください。