Haskellのコードリーディングって難しくない?

たとえばFRPライブラリ reactivce の特徴である
Sink と Event の仕組みや実際の振る舞いについて調べたいとする。

というのも、makeEvent 関数でタプル (sink, event) を作ると、
あたかも、プログラム内のある場所で sink を評価すると、
全く別の場所にある event が反応したかのように表面上は振る舞って、
なかなか興味深い。

だが、とりあえず Sink a の型を見ても a -> Action としか分からない。
makeEvent 関数のソースを見ても、いきなり (fmap.fmap) が出てくるし。

こういう場合は、adaptE 関数から順に自分で簡約しながら見ていく方が良いのかな。
(reactive のチュートリアルでは皆 adaptE 関数から実際の計算が始まる)

C/C++ だと比較的大きな機能がまとまって書かれているけど、
Haskell だと非常に細かい機能が関数呼び出しという数珠繋ぎで表現されていて、
それらがソース中のバラバラの場所に書かれていたりするから、
なかなか C/C++ と同じ要領ではコードリーディングしにくい。
Haskell としてコードが洗練されているほど、振る舞いが追いにくい印象。

もしかしたら、同じようにできるのかも知れんが、何かコツでもあるのかな。