将函数作为参数传递给scheme中的另一个函数

时间:2014-09-07 09:18:35

标签: functional-programming scheme

基本上,我想做的是:

我有一个函数square(x)(define (square x) (* x x))(f(x)= x * x),另一个函数mul_two (define (mul_two x) (* 2 x))(g(x)= 2 * x),我想要基于上述两个函数构造一个新函数,新函数的作用是:2*(x*x)(p(x)= g(f(x))),如何在scheme中编写这个新函数?虽然它在数学形式上非常直接,但我完全坚持这一点。

3 个答案:

答案 0 :(得分:3)

(define (new_fun x) (mul_two (square x)))

编辑:

(define (square x) (* x x))
(define (mul_two x) (* 2 x))

(define (new_fun fun1 fun2) (lambda (x) (fun2 (fun1 x))))

((new_fun square mul_two) 10)

你将得到200.(10 * 10 * 2)

此外,您可以像在球拍中撰写一样实现通用 my-compose 功能:

(define (my-compose . funcs)
  (let compose2
    ((func-list (cdr funcs))
     (func (lambda args (apply (car funcs) args))))
    (if (null? func-list)
      func
      (compose2
        (cdr func-list)
        (lambda args (func (apply (car func-list) args)))))))

你可以通过以下方式获得新的乐趣:

(define new-fun (my-compose mul_two square))

答案 1 :(得分:3)

通常使用compose来执行您要求的操作,根据链接文档:

  

返回组成给定函数的过程,首先应用最后proc,最后应用proc

请注意compose非常强大,它允许我们传递任意数量的函数,这些函数使用并生成任意数量的值。但是您的示例很容易实现:

(define (square x)   ; f(x)
  (* x x))

(define (mul_two x)  ; g(x)
  (* 2 x))

(define p ; g(f(x))
  (compose mul_two square))

(p 3) ; same as (mul_two (square 3))
=> 18

如果出于某种原因,您的Scheme解释器没有内置compose,则很容易编写代码 - 如果我正确理解了对其他答案的评论,那么您希望使用{{3 }}。让我们为一个简单的例子写一个,每个函数只生成/消耗一个值,并且只编写两个函数:

(define my-compose ; curried and simplified version of `compose`
  (lambda (g)
    (lambda (f)
      (lambda (x)
        (g (f x))))))

(define p ; g(f(x))
  ((my-compose mul_two) square))

(p 3) ; same as (mul_two (square 3))
=> 18

答案 2 :(得分:0)

在#!racket(语言)中compose使用:

(define double-square (compose double square))

这与执行此操作相同:

(define (double-square . args)
   (double (apply square args))) 

如果您想使用Scheme(标准),您可以自己动手:

#!r6rs
(import (rnrs))

(define (compose . funs)
  (let* ((funs-rev (reverse funs))
         (first-fun (car funs-rev))
         (chain (cdr funs-rev)))
    (lambda args
      (fold-left (lambda (arg fun) 
                   (fun arg))
                 (apply first-fun args)
                 chain))))

(define add-square (compose (lambda (x) (* x x)) +))
(add-square 2 3 4) ; ==> 81