## 預習

按 C 的計畫，這天要利用 Language.Haskell.Exts 這套件讀出原始碼本身屬於哪個套件、 import 了哪些套件，再把它們通通讀出來，然後印出來。建議先讀過的套件有：

  * [haskell-src-exts][src-exts]
  * [Language.Haskell.Exts.Annotated.Syntax][annotated-syntax]
  * [Language.Haskell.Exts.Annotated.Parser][annotated-parser]
  * [Language.Haskell.Exts.Pretty][pretty]
  * [Haskell Standard Library][libraries]
  * [Data.Map.Strict][data-map-strict]
  * [System.IO][system-io]
  * [System.FilePath][system-filepath]
  * [Control.Exception][control-exception]

haskell-src-exts 在做那個愚蠢的、不 pretty 的 print 看過好幾次了。那時看的是 Language.Haskell.Exts.Syntax ，後來大家用的是 Language.Haskell.Exts.Annotated.Syntax 。要注意的是，後者的結構跟前者完全不同。 petercommand 一下子就發現了這件事。

Language.Haskell.Exts.Annotated.Syntax 下的 `ann` 和 `amap` 是操作 annotations 的[工具][afuncs]，以前 Alex 有提過。前者把 annotation 拔出來，後者只對 annotation 作用。註解中還提到： `if all nodes in the AST tree are to be affected, use fmap.` ，這次可以用得上。

Language.Haskell.Exts.Pretty 比較妙的是， pretty 完就變回 Haskell 了，跟有縮排的 AST 不同。但對我們來說，更需要後者。那時曾試著看 TH 的，發現 [Text.PrettyPrint][HPJ] ，但沒看懂。現在不知道看不看得懂 XDXD
    
另外 Hackage 多用 [Haddock][Haddock] [註解][CodingStyle]。但是 Base 的 lhs 多用 `\begin{code}` 跟 `\end{code}` 把 code 包起來（LaTex suggestions）。這樣還有什麼意思呢？ github 上只有到 2001 年的 commit ，不知道最早是不是就這樣？
    
Control.Exception 的作者是[嘴吐][cokmett] category theory 的 ekmett ！

[src-exts]: https://hackage.haskell.org/package/haskell-src-exts
[annotated-syntax]: https://hackage.haskell.org/package/haskell-src-exts-1.17.1/docs/Language-Haskell-Exts-Annotated-Syntax.html
[afuncs]: https://github.com/haskell-suite/haskell-src-exts/blob/master/src/Language/Haskell/Exts/Annotated/Syntax.hs#L1052
[annotated-parser]: https://hackage.haskell.org/package/haskell-src-exts-1.17.1/docs/Language-Haskell-Exts-Annotated-Parser.html
[pretty]: https://hackage.haskell.org/package/haskell-src-exts-1.17.1/docs/Language-Haskell-Exts-Pretty.html
[HPJ]: https://hackage.haskell.org/package/pretty-1.1.3.3/docs/Text-PrettyPrint.html
[libraries]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/
[data-map-strict]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/containers-0.5.6.2/Data-Map-Strict.html
[system-io]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base-4.8.2.0/System-IO.html
[system-filepath]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/filepath-1.4.0.0/System-FilePath-Posix.html
[Haddock]: https://www.haskell.org/haddock/
[CodingStyle]: https://ghc.haskell.org/trac/ghc/wiki/Commentary/CodingStyle
[control-exception]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base-4.8.2.0/Control-Exception.html
[cokmett]: https://www.reddit.com/r/haskell/comments/1ssa5g/edward_kmett_such_mathematical_wow_algebraic/

## 準備

一開始要以 haskell-src-exts 讀檔案，於是先在 `app/Main.hs` 中加上 `import Language.Haskell.Exts.Annotated` ；

```Haskell
module Main where

import Language.Haskell.Exts.Annotated

import Lib

main :: IO ()
main = someFunc
```

並修改 `my-project.cabal` ，在 `executable my-project-exe` 那段的 `build-depends:` 加上 `haskell-src-exts` ：

```
executable my-project-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , my-project
                     , haskell-src-exts
  default-language:    Haskell2010
```

接著執行 `stack build` ，會看到它開始下載並編譯套件，需要花一點時間。
