List Package } ・これは Package = F Package を解くことと同義 ・ここで、型Fは F r = { ..., buildInputs : List r } のように定義される ・ここで、Fを適用しても変わらない型Xを不動点と呼ぶ → Package型を構成するためには、この方程式の不動点を構成する必要がある ・再帰データ型を許す言語では不動点コンストラクタを自然に定義できる(Fix型) ・Dhallは停止性が保証されているので再帰ができず、Fixをそのまま定義できない ・Church encodingすることで不動点を型として直接書かずに実装する
= λf. λx. x ・1 = λf. λx. f x ・2 = λf. λx. f (f x) ・PackageをChurch encodingすると、Package = forall r (F r → r) → r ・任意の r へのfoldを与えると、r を返す関数として表す ・これでPackageを直接書かずに再帰を回避できた