recursion - Clojure 惰性序列和 letfn

标签 recursion clojure

我正在 Clojure 中尝试一些惰性流。 如果我这样做:

(defn ints-from [n]
   (cons n (lazy-seq (ints-from (inc n)))))

(def nats (ints-from 0))

没关系,我可以做这样的事情:

(take 5 nats)

现在我尝试将 2 个函数封装在 1 个函数中:

(defn natz[]
( letfn   [(aux [n]((cons n (lazy-seq (aux (inc n)))))) ] (aux 0) ))

这似乎可以编译,但没有达到我的预期。

(take 4 natz)

给出:

(user=> IllegalArgumentException Don't know how to create ISeq from: user$natz    
clojure.lang.RT.seqFrom (RT.java:494)

我错过了什么?

最佳答案

letfn 定义中少一个括号,多一个括号来调用 natz 函数

(defn natz[]
  (letfn [(aux [n] (cons n (lazy-seq (aux (inc n)))))]
    (aux 0)))

使用示例:

(take 4 (natz))
=> (0 1 2 3)

关于recursion - Clojure 惰性序列和 letfn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20837548/

相关文章:

python - Django教程最大深度递归

clojure - 为什么 recur 期望使用 %& 的短格式函数有一个参数

function - 是否有等同于 def 的 Clojure 宏?

clojure - 从 CLJ 发出调用 CLJS 函数的 Hiccup 控件

matlab - 在 clojure 中,什么是计算整数向量平均值的有效方法

clojure - 仅更新与 coll 中的 pred 匹配的第一个元素的惯用方法

recursion - 如何在 Lisp 中对 &REST 参数编写递归宏调用?

java - 使用 BigInteger 进行尾递归乘法

通过重复输入/迭代来定义列表

python - 我不懂递归