就个人而言,我认为当您从类型中删除多余的括号时会变得更加明显(就像非计划者会写它一样):
int -> (int -> bool -> int) -> bool -> int
所以你应该写一个给定三个参数并返回一个int
. 也就是说,解决方案必须可以用以下形式表示:
lambda n. lambda f. lambda b. ____
但是你如何填补这个洞?好吧,看看你从参数中得到什么类型,很容易看出你可以通过应用and将它们连接f
在一起,产生一个. 所以:n
b
int
lambda n. lambda f. lambda b. f n b
这是一种解决方案。但是仔细观察这个术语会发现,最里面的 lambda 实际上可以被 eta-reduced,给出一个更简单的术语:
lambda n. lambda f. f n
但实际上,这个问题有点退化,因为返回一个 int 总是微不足道的。所以最简单的解决方案可能是:
lambda n. lambda f. lambda b. 0
获得解决方案的一般方案通常是对类型结构进行简单归纳:如果您需要一个函数,则写下一个 lambda 并递归处理主体。如果你需要一个元组,那么写下一个元组并递归地处理它的组件。如果您需要原始类型,那么您可以选择一个常量。如果你需要一些你没有的东西(通常在多态的情况下),在范围内寻找一些可以给你这样的东西的函数参数。如果该参数本身是一个函数,请尝试递归构造一个合适的参数。