嗨， 1/14 的 caasi ， commits 看得怎麼樣了？下一次活動是 1/28 ，然後就要過年了。我是 2/28 的 caasi ，現在要跟你說一些未來的事情，像是你會去一趟上海，你會很煩，但是你知道你必須要了解中國。你會在上海交大讀著印出來的程式，自我感覺良好，卻還是沒能完全搞懂。

但最重要的是，我要捏他！這樣也許你在學習的路上可以開心一點 XD

--

```Haskell
main = rhs
```

會變成：

```Haskell
PatBind l
  (PVar l (Ident l "main"))
  rhs
  Nothing
```

l 是那長長一大串，包含這段 AST 來自程式碼那邊的原始資訊。可以靠著 `forgetL` 一次清掉。 PVar 的 P 是 Pattern 的 P 。 Nothing 是 where 的 binds ，在此例中什麼都沒有，故為 Nothing 。

```Haskell
case Just (Just (Pair 3 5)) of
```

成了：

```Haskell
Case l
  (App l
    (Con l (UnQual l (Ident l "Just")))
    (Paren l
      (App l
        (Con l (UnQual l (Ident l "Just")))
        (Paren l
          (App l
            (App l
              (Con l (UnQual l (Ident l "Pair")))
              (Lit l (Int l 3 "3"))
            )
            (Lit l (Int l 5 "5"))
          )
        )
      )
    )
  )
```

後面接著的是 `[Alt l]` 。

```Haskell
_ | False -> exp
```

成了：

```Haskell
Alt l
  (PWildCard l)
  (GuardedRhss l
    [ GuardedRhs l
        [ Qualifier l (Con l (UnQual l (Ident l "False")))
        ]
        exp
    ]
  )
  Nothing
```

`Rhs` 分為 `UnGuardedRhs` 和 `GuardedRhss` 兩種，前者直接帶個 `exp` ；後者帶一串 `GuardedRhs` ，都是 `| stmts = exp` 或 `| stmts -> exp` 這種樣子。

```Haskell
| Nothing -> exp
```

成了：

```Haskell
Alt l
  (PApp l (UnQual l (Ident l "Nothing")) [])
  (UnGuardedRhs l exp)
  Nothing
```

原程式中的 `Nothing` 是 data constructor 喔，所以才包在 `PApp` 裡面，後面的 `[]` 表示沒有參數。

```Haskell
a | False -> exp0
  | True  -> exp1
```

則成了：

```Haskell
Alt l
  (PVar l (Ident "a"))
  (GuardedRhss l
    [ GuardedRhs l
        [ Qualifier l (Con l (UnQual l (Ident l "False")))
        ]
        exp0
    , GuardedRhs l
        [ Qualifier l (Con l (UnQual l (Ident l "True")))
        ]
        exp1
    ]
  )
  Nothing
```

可以清楚看見 `GuardedRhss` 中的兩個 `GuardedRhs` 。

現在你知道你可以放心看看 `altToPartial` 、 `dataConToShape` 、 `buildReorder` 與 `orderedCaseToExp` 這些 function 。 AST 只要靜下心來就能懂，接下來交給時間就是了。
