【问题标题】:Currying using Scheme使用 Scheme 进行柯里化
【发布时间】:2013-10-04 00:34:20
【问题描述】:

我正在努力进行练习考试的三个功能。

一个函数,它接受一个谓词“pred”和一个集合“x”,并返回集合中所有元素的谓词是否为真。

我在尝试什么:

(define (all? pred x)
  (lambda (t) 
    (equal? (pred t) x)))

由于 pred t 返回谓词为真的 x 的子集,我试图将它与原始集合进行比较......这显然不是这样做的方法。

一个函数,它接受一个操作“op”和一个集合“x”并返回一个新集合,其中基本上 op 函数已映射到整个集合。基本上相当于地图,所以你会认为我不应该在这方面寻求帮助......

我正在尝试什么:

(define (map op x)
  (lambda (t) 
    (map (op t))))

我一定错过了柯里化的一些基本方面,因为我觉得这些操作应该很简单..

【问题讨论】:

  • 你需要知道set的接口才能回答这个问题。
  • 所描述的操作似乎都不需要柯里化。每个中的柯里化参数是什么?
  • @AdamBurry 的要求很重要。这是否使用您在之前的问题representing sets with lambda functions 中提到的相同集合表示,其中集合由其特征函数表示,给定潜在元素,如果元素在集合中则返回 true,否则返回 false。例如,(lambda (x) (> x 2)) 是大于二的数字集合,even? 是偶数集合?
  • 如果您仍在使用集合由其特征函数表示的表示,我不明白您如何做到这一点。如果f 表示某个集合,那么当且仅当x 在集合中时(f x) 为真,您仍然无法列出集合的所有元素(实际上,集合可能有无限多个元素)。如果你只想要一个“集合”,它的元素是f 的元素,也满足一些谓词p,那么,由于p 也代表一个集合,你不能使用f 的“交集”和p?也就是说,你不能使用(lambda (x) (and (f x) (p x)))吗?

标签: scheme racket


【解决方案1】:

所以你正在尝试做类似andmap的事情

您可以定义一个评估列表的函数,以查看它们的所有元素是否都是 #t 值。

(define full-true?
  (λ (lst)
   (if (empty? lst) #t
     (if (car lst) (full-true? (cdr lst))
         (car lst)))
))

那么,你的主要功能是:

(define for-all?
 (lambda 
   (pred lst-of-items)
    (full-true? (map (lambda (x) (pred x)) lst-of-items))
))

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2011-08-06
    • 2011-11-02
    • 1970-01-01
    • 2010-10-16
    • 2016-06-17
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多