从匿名函数中调用另一个匿名函数

3
我希望调用一个匿名函数,但不使用另一个匿名函数的简写表达式。
以下操作无效,因为最后的计算结果被返回:
user> ((fn [x] (fn [y] (inc y)) x) 3)
3

现在我想找到一种方法来从外部函数调用内部匿名函数。 我通过以下方法成功实现,但它看起来很复杂:
user> ((fn [x] (let [f (fn [y] (inc y))] (f x))) 3)
4     ;; good, 4 is the result I want here

有没有更简单的方法来嵌套匿名函数?
2个回答

8

让我们分解第一行:

((fn [x]
   (fn [y] (inc y))  ; construct an anonymous function
   x)                ; return the outer parameter
 3)

请注意,内部函数从未被使用。
你似乎想要做的事情是:
((fn [x]
   ((fn [y] (inc y)) x))
 3)

哦,我明白了。通过将*(fn ...) x*包装在列表中,我返回了其评估结果,而不是返回外部参数。为什么我之前没想到呢!虽然看起来不起眼,但你的答案对我帮助很大!谢谢 :) - Cedric Martin

5
我强烈推荐使用let表达式来提高代码的清晰度,例如:
(let [f (fn [y] (inc y))
      g (fn [x] (f x))]
  (g 3))

我甚至可以使另一个函数接受前一个函数。
(let [f (fn [y] (inc y))
      g (fn [h x] (h x))]
  (g f 3))

甚至可以如下所示:
(let [f (fn [y] (inc y))
      g (fn [h x] (h x))
      gf (partial g f)]
  (gf 3))

它使函数的阅读和理解变得更加容易。即使使用let,我也不会停在这里,而是继续改进另一个更好的函数。
经过一番思考,我认为没有必要定义一个单参数函数f,因为inc已经实现了这一点。此外,人们可能会过度使用阅读器的匿名函数文字,此时let表单变成:
(let [f inc
      g #(% %2)
      gf (partial g f)]
  (gf 3))

但是我越想,问题就越难理解。

你能描述一下你真正想要达到什么目的吗?


1
我想要实现的是更好地理解这门语言的工作原理 ;) - Cedric Martin
希望你对我的回答满意。 - Jacek Laskowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接