個人的には、型から冗長な括弧を削除すると、もう少し明白になると思います (非スキーマが書くように):
int -> (int -> bool -> int) -> bool -> int
したがって、3 つの引数が与えられ、 を返す関数を作成することになっていますint
。つまり、解は次の形式で表現できなければなりません。
lambda n. lambda f. lambda b. ____
でもどうやって穴埋めするの?f
パラメータから取得する型を見ると、 と に適用してn
をb
生成することで、それらを結合できることが簡単にわかりますint
。そう:
lambda n. lambda f. lambda b. f n b
それが一つの解決策です。しかし、この項を注意深く見ると、最も内側のラムダが実際にはイータ簡約され、さらに単純な項になることがわかります。
lambda n. lambda f. f n
しかし実際には、int を返すことは常に些細なことなので、この質問は少し退化しています。したがって、おそらく最も簡単な解決策は次のとおりです。
lambda n. lambda f. lambda b. 0
解決策に到達するための一般的なスキームは、多くの場合、型構造の単純な誘導によるものです。関数が必要な場合は、ラムダを書き留めて、本体を再帰的に処理します。タプルが必要な場合は、タプルを書き留めて、そのコンポーネントを再帰的に処理します。プリミティブ型が必要な場合は、定数を選択するだけです。持っていないものが必要な場合 (通常はポリモーフィックの場合)、そのようなものを提供するスコープ内の関数パラメーターのいくつかを探します。そのパラメーター自体が関数である場合は、適切な引数を再帰的に構築してみてください。