什麼時候應該用Finally Tagless,什麼時候應該用Data Type A La Carte?


主要取決於需要表示的 DSL 的複雜程度。Data types a la carte 的優勢在於有許多開箱可用的 recursion schemes 組合子可以用來簡化代碼,缺點是只有處理比較簡單的 DSL 時比較簡單好用:

1. 涉及互遞歸的數據類型、GADT 時,需要高階的 HFunctor 而不是普通的 Functor,詳細參考 Compositional Data Types 一文和 compdata 庫的實現

2. 涉及 contravariant 的數據類型,recursion schemes 的組合子就作廢了(因為這個假的 base functor 根本不是 Functor)。Edward Kmett 就 HOAS 的例子提出過討論,參考 PHOAS For Free 一文

而 Finally tagless 的優勢在於表示互遞歸、較複雜的 GADT 等都比較簡單,且許多情況下使用 Haskell 2010 的特性即可實現。缺點在於需要寫的 boilerplate code 更多一些。

最後提一下,Data types a la carte 和 Finally tagless 都只是設計模式而已,兩個 idea 並不互斥,可以一同使用,Andrew Cowley 有一個 talk 有介紹:https://www.youtube.com/watch?v=_KioQRICpmo


推薦閱讀:

什麼是free structure?
如何理清 lens 這個庫的各個組件,熟悉各種高級玩法?
為什麼函數式語言中all odd [] 得到True?
C++ 用作函數式語言時,是否有語法上的缺失?
怎樣評價 LambdaConf 提出的「函數式編程技能表」?

TAG:函數式編程 | Haskell | 類型系統 |