Scheme - 嵌套定义混淆
Posted
技术标签:
【中文标题】Scheme - 嵌套定义混淆【英文标题】:Scheme - nested definition confusion 【发布时间】:2014-05-30 06:33:54 【问题描述】:我目前在创建 func 时遇到问题,并且是 Scheme 的初学者。为了达到这样的结果,我必须在 func 中定义 double 吗?
(func double 3 '(3 5 1))
将返回 (24 40 8),因为每个元素都加倍了 3 次。
【问题讨论】:
你能把你的问题说清楚一点吗? 【参考方案1】:如果我正确理解您的问题,您可以通过以下方式实现func
:
(define (func f n lst)
(do ((n n (sub1 n))
(lst lst (map f lst)))
((zero? n) lst)))
示例用法:
> (func (lambda (x) (* x 2)) 3 '(3 5 1))
=> (24 40 8)
【讨论】:
【参考方案2】:#lang racket
(define (repeat f x n)
(cond [(= n 0) x]
[else (f (repeat f x (- n 1)))]))
(define (func f n xs)
(map (λ(x) (repeat f x n)) xs))
(define (double x)
(* 2 x))
(func double 3 '(3 5 1))
【讨论】:
有趣地比较和对比你的方法:你用一个重复的函数映射一次,而我用原始函数映射多次。 :-) 不错的观察。重读 OP 的问题,我想我们都忘了回答如何定义 double :-) 我们专注于 func。 好吧,如果您从字面上理解这个问题,OP 想要定义func
,并想知道是否必须在其中定义 double
。答案当然是否定的,这两个答案都证明了这一点。【参考方案3】:
可能是这样的:
(define (cmap fun arg1 lst)
(map (lambda (x) (fun arg1 x)) lst))
但你真的想这样做(cmap list 1 (get-some-calc x) (get-list))
但很难让它接受任何咖喱论点,也许你想要多个列表。你这样做:
(let ((cval (get-come-calc x)))
(map (lambda (x) (list 1 cval x)) (get-list)))
【讨论】:
【参考方案4】:不,double
需要在func
之外,因为它将作为参数(绑定到f
)传递给func
:
(define (double n) (* 2 n))
(define (times f e t)
(if (= t 0)
e
(times f (f e) (- t 1))))
(define (func f t lst)
(map (lambda (e) (times f e t)) lst))
然后
> (func double 3 '(3 5 1))
'(24 40 8)
OTOH,在这种情况下,times
可以在 func
中定义,但它是一个可重用的过程,所以我将它留在外面。
【讨论】:
您可以将符号'double
作为消息传递,并具有内部调度和定义,特别是如果 func 要保持任何内部状态。
我没有看到内部调度的意义,很抱歉,如果func
有某种状态,我认为没有必要这样做。你能详细说明一下吗?
如果您保留一个内部调度表或 alist,您可以避免命名空间冲突,但保留一种扩展可用功能的方法,例如双字符串的函数,或将任何内部函数应用于树和向量。也许您想在每次传入特定消息时增加一个计数器。
是的,可能不是这里需要的,但消息传递可能非常有用。以上是关于Scheme - 嵌套定义混淆的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Web Api 中的 Swashbuckle 被嵌套控制器混淆
R语言使用caret包的confusionMatrix函数计算混淆矩阵使用编写的自定义函数可视化混淆矩阵(confusion matrix)
R语言自定义多分类混淆矩阵可视化函数(mutlti class confusion matrix)R语言多分类混淆矩阵可视化