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 被嵌套控制器混淆

Weka RF 没有给出任何混淆矩阵或预期结果

嵌套命名空间与VS 2012的混淆

Android开发混淆使用手册

R语言使用caret包的confusionMatrix函数计算混淆矩阵使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言自定义多分类混淆矩阵可视化函数(mutlti class confusion matrix)R语言多分类混淆矩阵可视化